-
[Haskell] #0 Hello, Haskell!곡λΆ/ν¨μν νλ‘κ·Έλλ° 2020. 1. 9. 21:28
μλ νμΈμ, λ λͺ¬ν΄μ λλ€π
λ§€μΌ κ°μ΄ λ§λ§ν κΈκ°μ μ°Ύμ ν€λ§€κ³ μμλλ° λ§μΉ¨.. μ κ° Haskell μ€ν°λλ₯Ό μμνκ² λμλ€μ? γ
μ λλ€μ! (λΆλ΄μ€λ½μ§ μμ) κΈκ°μ΄ μκ²Όμ΄!
νΉμλΌλ νλ¦° λΆλΆμ΄λ μ§λ¬Έ μ 보ν΄μ£Όμλ©΄ λ§€μ° κ°μ¬νκ² μ΅λλ€ :)
κ΅μ¬λ‘λ κ°μ₯ μ¬μ΄ νμ€μΌ μ± (μμ΄ μλ¬Έμ 무λ£λ‘ 곡κ°λμ΄ μμ΅λλ€ http://learnyouahaskell.com/chapters. μλ¬Έμ΄ λ μ½λ€λ νμ΄ λ§κΈ΄ ν©λλ€.)
μ»΄νμΌλ¬λ μ¨λΌμΈ IDE https://repl.it/languages/haskell μ¬μ©νκ³ μμ΅λλ€.
μ± μμλ GHCiλ₯Ό μ§μ μ€μΉν΄ μ¬μ©νλλ°, μ λ μ€μΉμ μ€ν¨ν΄μ.. μ±κ³΅νλ©΄ λ μ¬λ €λ릴κ²μ...πλͺ λ²μ μ½μ§ λμ μ±κ³΅νμ΅λλ€ :) νΉμ κΆκΈνμ λΆμ μ°Έκ³ ν΄μ£ΌμΈμ
2020/01/11 - [κ°λ° μ½μ§κΈ°/κ·Έ μΈ] - [Haskell] MAC OSμ GHC (Haskell μ»΄νμΌλ¬)μ€μΉνκΈ°
κ·Έλμ λ, Haskellμ΄ λκΉμ?
μ κ° μ°Έκ³ νκ³ μλ κ΅μ¬μμμ μ μλ λ€μκ³Ό κ°μ΅λλ€.
1. νμ€μΌμ μμ ν¨μν νλ‘κ·Έλλ° μΈμ΄μ΄λ€. (Purely Functional)
ν¨μν νλ‘κ·Έλλ°μ μ΄λ€ μμ μ νλΌκ³ μ»΄ν¨ν°μκ² μλ €μ£Όλ κ²μ΄ μλλΌ κ·Έ μμ μ΄ λ¬΄μμΈμ§λ₯Ό μλ €μ€λ€. μ΄λ¬ν μμ μ ν¨μλΌκ³ νλ€.
κ·Έλ¦¬κ³ ν λ² ν¨μ λ΄μ λ³μλ₯Ό μ€μ νμΌλ©΄ κ·Έ κ°μ λ°κΏ μ μλ€. μ΄ κ²μ λΆμμ©(side effect)κ° μλ€κ³ νλ€.
λ°λΌμ, μ΄λ€ ν¨μλ₯Ό κ°μ λ§€κ° λ³μλ‘ λ λ² νΈμΆνλ©΄ νμ κ·Έ κ²°κ³Όλ κ°λ€. μ΄λ₯Ό μ°Έμ‘° ν¬λͺ μ±μ΄λΌκ³ νλ€.
2. νμ€μΌμ Lazyνλ€.
νμν μμ κΉμ§ μμ μ 미룬λ€. λ§μ½ λ°°μ΄μ 100λ²μ§ΈκΉμ§ ν©μ κ³μ°νλΌκ³ νκ³ κ·Έ κ°μ μΆλ ₯νκ±°λ μ¬μ©νμ§ μμΌλ©΄, νμ€μΌμ κ·Έ κ°μ κ³μ°νμ§ μλλ€.
3. νμ€μΌμ Statically Typed μ΄λ€.
νμ€μΌμ μ¬μ©ν λλ λͺ¨λ λ³μμ νμ μ μΌμΌν μ§μ ν΄μ£Όμ§ μμλ λλ€. νμ€μΌμ λ°νμμ΄ μλ μ»΄νμΌ μμ μμ λͺ¨λ λ³μμ νμ μ μ€μ€λ‘ μμλΈλ€.
4. νμ€μΌμ μ°μνκ³ κ°κ²°νλ€.
νμ€μΌμ μ½λκ° μ§§λ€. μ΄λ λ²κ·Έλ₯Ό μ€μ¬μ£Όκ³ μ μ§λ³΄μλ₯Ό μ½κ² νλ€.
...λΌκ³ νλ€μ. μμ§κΉμ§λ μ€μ μ½λλ₯Ό λ³΄μ§ λͺ»ν΄μ μ΄ν΄κ° μ μλλ€μ. κ·Έλ λ€λ©΄ μ½μμ μΌκ³ κΈ°λ³Έμ μΈ μλ£νλ€μ μ΄ν΄λ³ΌκΉμ?
μ΄λ²μ μ΄ν΄λ³Ό λ΄μ©λ€
1. μ«μ
2. λ¬Έμμ΄
3. Bool
4. ν¨μ
5. if문
6. μ½μμ μ¬μ©νλ€λ©΄ μ¬μ©ν κ°λ¨ν μΆλ ₯ ν¨μ putStrLn
μ± μμλ μλ¬Έ + 1μ₯μ 리μ€νΈ μ κΉμ§μ λ΄μ©μ λλ€.
κ·ΈλΌ μ΄λ ν λ² μ¨λΌμΈ μλν°λ₯Ό μΌμ ν€λ©(...)ν΄λ³ΌκΉμ?
https://repl.it/languages/haskell
1. μ«μ
μ μν, λΆλμμμ μ μ§μν©λλ€.
2. λ¬Έμμ΄
" "λ‘ κ°μΈλ©΄ λ©λλ€. "μλ " μ²λΌ.
hi = "hello"
Haskellμμ λ¬Έμμ΄μ Charμ Listμ΄κΈ° λλ¬Έμ, ++ μ°μ°μλ₯Ό μ¬μ©ν΄μΌ ν©λλ€.
μλμ a + bλ '+' κ° μ«μλ§ λ°λ νμ μ΄λΌμ λμνμ§ μκ³ μ€λ₯κ° λλ€μ.. λμ€μ λ¬Έμμ΄ μ°μ°μ λ€μ΄κ°λ©΄ μ μ μκ² μ£ , λ!3. Bool
False, True λ‘ κ°μ νννκ³ , ||μΌλ‘ or, && κ° and, not(λ³μ)μΌλ‘ λΆμ μ λ§λ€ μ μμ΅λλ€.
νν 보μ΄λ !(λ³μ)λ λμνμ§ μλ€μ.
false = False
true = True
False && True //False
False || True // True
not (False) // True !(True)λ λμνμ§ μμ΅λλ€. ! μ°μ°μλ μλλ΄μ. νΉμ μμλ λΆ μμΌμλ©΄ μλ €μ£ΌμΈμ!4. ν¨μ
Haskellμ ν¨μν νλ‘κ·Έλλ° μΈμ΄μ΄μ£ . κ·Έ λλ¬Έμ ν¨μλ λ³μμ²λΌ μ μΈνκ³ μ¬μ©λ ν μ μλ΅λλ€.
μ¬μ€ μ°λ¦¬λ μ μμ μμ λ₯Ό νλ©΄μλ κ³μ ν¨μλ₯Ό μ°κ³ μμμ΄μ!
νΉμ 무μμΈμ§ λμΉμ±μ ¨λμ? λ§μμ. +, -, /... λ±λ±μ΄ λͺ¨λ λ€ ν¨μ μ λλ€.
a + b μ²λΌ λ§€κ° λ³μμ μ€κ°μ μ¨λ€κ³ ν΄μ μ€μ ν¨μλΌκ³ ν΄μ
μΌλ°μ μΈ μ ν¬κ° μλ ννμ ν¨μλ€μ μ΄λ¦μ΄ μμ μ€κ³ , λ€μ λ§€κ° λ³μλ€μ΄ μ€μ£ . κ·Έκ±Έ μ μ ν¨μλΌκ³ λΆλ¦ λλ€.
http://learnyouahaskell.com/starting-out#ready-set-go μ μμ λ₯Ό λ°λ €μ λ΄€μ΅λλ€.
νμ ν¨μλ λλ μλν΄λ΄€λλ°... μ€λ₯κ° λλ€μ. μ΄κ±΄ μ‘°κΈλ 곡λΆν΄ 보면 λμ€μ§ μμκΉ μΆλ€μ!
ν¨μ μ μ (Declaration)
//1κ°μ λ§€κ° λ³μλ₯Ό λ°λ ν¨μ
doubleme x = x + x
//2κ°μ λ§€κ° λ³μλ₯Ό λ°λ ν¨μ
addme a b = a + b
//ν¨μ μμμ λ ν¨μ λΆλ₯΄κΈ°
doubleus a b = doubleme a + doubleme b
//ν¨μλͺ μ λλ¬Έμκ° λμ§ μμ΅λλ€!
Doubleme x = x + x //μ€λ₯!
hello' a = a + 2
// '(Apostrophe)λ μ¬μ©ν μ μμ΄μ. ν¨μλͺ μ μ΄κ²μ΄ λΆλ κ²½μ°λ μ± μμλ Haskellμ μΌλ°μ μΈ ν¨μμ²λΌ Lazy νμ§ μκ³ , μ¦κ°μ μΌλ‘ μνμ νλ (strict)ν¨μλ, μ΄λ¦μ΄ λΉμ·ν ν¨μλ λ³μμκ² λΆμΈλ€κ³ ν©λλ€.ν¨μ νΈμΆ
doubleme x = x + x //μ μ
doubleme 3 // νΈμΆ. κ²°κ³Ό 6
//2κ°μ λ§€κ° λ³μλ₯Ό λ°λ ν¨μ
addme a b = a + b
addme 3 4 // 7
//νΈμΆ, ν¨μ μ μ μ μ μ μμλ μ ν μκ΄ μμ΅λλ€!
doubleme (doubleus 4 3)ν¨μ μ€μ²© μ¬μ©
doubleme x + x //μ μ
doubleme (doubleme 3) //μ¬μ©. κ²°κ³Ό 12+ ν¨μλ μ°μ μμκ° κ°μ₯ λλ€.
ν¨μλ μ°μ μμκ° κ°μ₯ λμ΅λλ€. μλ μλ₯Ό λ³΄μ£ !
//ν¨μκ° κ°μ₯ λμ μ°μ μμλ₯Ό κ°λλ€...!
succ 2 * 3 //μ 7μ΄ μλλΌ 9
//succ2 κ° λ¨Όμ μ€νλμ΄ 3μ΄ λκ³ , κ·Έ μ΄ν 3 * 3μ΄ λμ΄ 9κ° λλ€.
(succ 2) * 3 //μ¦ μ΄μ κ°μ
//μ°μ μμλ₯Ό λ°κΎΈλ €λ©΄ μλμ²λΌ κ΄νΈλ₯Ό μμ°μ.
succ (2*3)5. if λ¬Έ
Haskellμμ, ifλ¬Έμ μ¬μ©ν λ, elseλ νμ μ λλ€. λΉμλμ΄μλ μλμ΄μ!
isBiggerThan100 a = if a > 100 then True else False // 1μ€λ‘ μ μΈ νκΈ°
doubleSmallNumber x = if x > 100
then x
else x* 2
doubleSmallNumber x = (if x > 100
then x
else x* 2) + 1
//κ΄νΈλ μ¬μ©ν΄μ λ¬Άμ μ μμ΅λλ€6. Interactive Compilerκ° μλ κ²½μ° μ¬μ©ν κ°λ¨ν μΆλ ₯ ν¨μ putStrLn
μ λ μ€μΉμ κ³μ μ€ν¨νκ³ μμ΄μ μ¨λΌμΈ Interactive Compilerλ₯Ό μΌμ§λ§, λκ΅°κ°λ μ±κ³΅νμ μ μ»΄νμΌ νμ€ κ² κ°κΈ°μ...
μ½λλ μ κ° μ°κ³ μλ μ¨λΌμΈ IDEμ μμ μ½λμ ν΄μ»€λν¬μ 첫 λ²μ¨° νμ€μΌ λ¬Έμ λ₯Ό μ°Έμ‘°νμ΅λλ€!
main = do
putStrLn "μΆλ ₯" //νμΌλ‘ λ€μ¬μ°κΈ° ν΄μ£ΌμΈμ! κ° ν¨μμ ꡬ문μ ꡬλ³νλ λ― ν©λλ€
name <- getLine //μ λ ₯μ λ°μ΅λλ€. μν°λ‘ μ λ ₯μ λλΌ μ μμ΅λλ€
putStrLn ( "Hey, " ++ name)λ§λ¬΄λ¦¬ & μ¬ν νμ΅(?)
μ°λ€λ³΄λκΉ μ λ λͺ¨λ₯΄κ² λ³μ νμ μ μ μ§ μλ κ±°μ μ΅μν΄μ§λ€μγ γ νμ€ν νμ κ΄λ ¨ μμ€ν μ΄ κ°λ ₯νλ€λ 건 μ μκ² μ΅λλ€. ν¨μνμ΄λΌμ κ°μ²΄λΌλ κ°λ μ μλ κ² κ°μΌλ.. μκΎΈ μ λ λͺ¨λ₯΄κ² κ°μ²΄ μ μΈμ μ΄λ»κ² νμ§? νλ©° μ°Ύκ³ μλ€κ° μ μ΄κ±° ν¨μνμ΄μ§ λ§λ€ νκ³ λ€μ λλμκ°κ² λλ€μ. ν¨μν νλ‘κ·Έλλ°μ μ λ§ μμνκΈ΄ νλ€μ. μ°λ€ 보면 μ΅μν΄μ§κ² μ£ ?
μ¬ννμ΅?
ν΄μ»€λν¬μμλ Haskellλ‘ ν¨μν νλ‘κ·Έλλ°μ νμ΅ν μ μλ μ½μ€λ₯Ό μ΄μ΄λμλ€μ. μμ΄κ° λμ λ€λ©΄ ν΄λ³΄μλ μ’μ κ² κ°μ΅λλ€ :)
https://www.hackerrank.com/challenges/fp-solve-me-first/problem
'κ³΅λΆ > ν¨μν νλ‘κ·Έλλ°' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Haskell] #5 Type (2) (0) 2020.01.20 [Haskell] #4 Type (1) (0) 2020.01.19 [Haskell] #3 Tuple (0) 2020.01.12 [Haskell] #2 List(2) Range, list comprehension (0) 2020.01.12 [Haskell] #1 List (1) κΈ°λ³Έμ μΈ μ°μ°λ€ (0) 2020.01.11