μλ μ£ΌνΌν° λ ΈνΈλΆμ James Brockμ learn-you-a-haskell-notebookμ κΈ°λ³Ένλ‘ μ¬μ©ν©λλ€.
μ°Έκ³ : λ¦°ν (linting) κΈ°λ₯ λκΈ°
:opt no-lint
μ°Έκ³ : μ£ΌνΌν°λ© λ¨μΆν€
μ£ΌνΌν°λ©μμ κ°μ₯ μ μ©ν λ¨μΆν€ μ‘°ν©μ λ€μκ³Ό κ°λ€.
| λ¨μΆν€ μ‘°ν© | μ€νκ²°κ³Ό |
|---|---|
| Shift+Enter | μ νν μ μ μ€ννκ³ λ€μ μ λ‘ μ΄λ |
| Ctrl+Enter | μ νν μ μ μ€ν. λ€μ μ λ‘ μ΄λνμ§ μμ |
| Alt+Enter | μ νν μ μ μ€ννκ³ μ νν μ λ€μ μλ‘μ΄ μ μ½μ |
| Enter | μ νν μ νΈμ§ |
| Ctrl+Shift+- | 컀μ μμΉμμ μ λΆν |
λͺ¨λ κ°λ₯ν λ¨μΆν€ μ‘°ν©μ μΌνΈ μ¬μ΄λλ°μ μμΉν λ보기 μμ΄μ½μ λλ¬ νμΈνκ±°λ κ²μν μ μλ€. μ£ΌνΌν°λ©μ λ¨μΆν€ μ€μ λ° μ£Όμ λ¨μΆν€μ λν μμΈν μ€λͺ μ μ£ΌνΌν°λ© μΈν°νμ΄μ€λ₯Ό μ°Έμ‘°ν μ μλ€.
νμ€μΌμ κ²¬κ³ ν μ ν 체κ³λ₯Ό κ°μ§λ€. λͺ¨λ ννμμ μ νμ μ»΄νμΌ κ³Όμ μμ κ²°μ λλ©°, μ΄λ‘ μΈν΄ μμ±λ μ½λμ μμ μ±μ΄ λμμ§λ€. μλ₯Ό λ€μ΄, λΆμΈ μ νμ μ΄λ€ μ«μλ‘ λλλ €νλ νλ‘κ·Έλ¨μ μμ±νλ©΄, μ΄ νλ‘κ·Έλ¨μ μ»΄νμΌμ‘°μ°¨ λμ§ μλλ€. μ¦, νλ‘κ·Έλ¨μ΄ μ€νμ€μ μ€λ¨λ μλ μλ μ€λ₯λ₯Ό μΌμ μ»΄νμΌ κ³Όμ μμ λ§μλΈλ€. νμ€μΌμμ λ€λ€μ§λ λͺ¨λ λμμ μ νμ κ°κΈ°μ, νλ‘κ·Έλ¨μ΄ μ»΄νμΌ λκΈ° μ μ νλ‘κ·Έλ¨μ λν λ§μ μ 보λ₯Ό μμλΌ μ μλ€. λ°λΌμ νμ€μΌμ μ ν 체κ³λ₯Ό μ΄ν΄νλ μΌμ΄ λ§€μ° μ€μνλ€.
μ μ μ ν μΈμ΄μΈ C, μλ° λ±κ³Όλ νμ€μΌμ μ£Όμ΄μ§ λμμ μ νμ μΆλ‘ ν μ μλ€. λ§μ½ μ«μλ₯Ό μμ±νλ©΄ νμ·μΌ μ€μ€λ‘ κ·Έκ²μ΄ μ«μλΌλ κ²μ μΆλ‘ (infer) ν μ μλ€. λ°λΌμ ν¨μμ ννμμ μ νμ μΌλ°μ μΌλ‘ λͺ μνμ§ μμλ λλ€.
μ£Όμμ¬ν: μμΈκ° μλ€. λμ€μ μ΄ν΄λ³Ό κ²μ΄λ€.
μ νμ λͺ¨λ ννμμ΄ κ°λ μΌμ’
μ λΌλ²¨(label)μ΄λ€.
μ νμ μ£Όμ΄μ§ ννμμ΄ μ΄λ€ λΆλ₯μ μνλκ°μ λν μ 보λ₯Ό μλ €μ€λ€.
μλ₯Ό λ€μ΄
Trueλ λΆμΈ(Bool) μ νμ,
"hello"λ λ¬Έμμ΄ μ νμ κ°λλ€.
GHCiλ₯Ό μ¬μ©ν΄ μΌλΆ μμ μ νμ μ΄ν΄λ³΄μ.
:t λͺ
λ Ήλ¬Έμ μ΄μ©νμ¬ μ£Όμ΄μ§ ννμμ μ νμ μμλ³Ό μ μλ€.
::)μ μλ―Έ:t 'a'
'a'μ μ ν: Char. Charλ character μ μ½μ.:t True
:t "HELLO!"
"HELLO!"μ μ ν: [Char][Char]μμ λκ΄νΈλ 리μ€νΈλ₯Ό ννν¨.
μ¦, [Char]λ λ¬Έμλ‘ κ΅¬μ±λ 리μ€νΈλ₯Ό μλ―Έν¨.:t (True, 'a')
:t ('a','b','c')
(True, 'a')μ μ ν: (Bool, Char)('a','b','c')μ μ ν: (Char, Char, Char):t 4 == 5
νμ€μΌμ ννμμ ν¨μλ₯Ό νμ©νμ¬ μμ±νλ€. λ°λΌμ ν¨μ λν μ νμ κ°λλ€. ν¨μλ₯Ό μμ±ν λ, ν¨μμ μ νμ λͺ μμ μΌλ‘ νκΈ°ν νμλ μμ§λ§ λ§€μ° κ°λ¨ν ν¨μ μ μλ₯Ό μμ±ν λλ₯Ό μ μΈνκ³ , μΌλ°μ μΌλ‘λ μ ν μ μΈμ ν΄μ£Όλ κ²μ΄ μ’λ€. λ°λΌμ μ§κΈλΆν° μ μΈλλ λͺ¨λ ν¨μμ μ νμ λͺ μν κ²μ΄λ€.
μμ
2μ₯μμ 쑰건μ μλ²μ μ΄μ©νμ¬ λ¬Έμμ΄μμ λλ¬Έμλ§ λ¨κΈ°λ ν¨μ removeNonUppercaseλ₯Ό
λ€μκ³Ό κ°μ΄ μ μνμλ€.
removeNonUppercase str = [ c | c <- str, c `elem` ['A'..'Z']]
μ΄μ μ ν¨μμ μ νμ νμΈν΄λ³΄μ.
:t removeNonUppercase
removeNonUppercase ν¨μμ μ νμ [Char] -> [Char] μ΄λ©°,
νλμ λ¬Έμμ΄μ μΈμλ‘ λ°μ λ€λ₯Έ λ¬Έμμ΄μ λ°ννλ ν¨μλΌλ μλ―Έμ΄λ€.
μ΄λ λ― removeNonUppercase ν¨μμ κ°μ΄ κ°λ¨ν ν¨μμ μ νμ
νμ€μΌ μ»΄νμΌλ¬κ° μ€μ€λ‘ μΆλ‘ ν΄λΌ μ μλ€.
λ°λΌμ μ μ΄μ μ ν¨μλ₯Ό μλμ κ°μ΄ μ μν μλ μλ€.
removeNonUppercase :: [Char] -> [Char]
removeNonUppercase str = [ c | c <- str, c `elem` ['A'..'Z']]
[Char]μ
Stringμ
λμμ΄μ΄μ΄κΈ°μ μλμ κ°μ΄ μ μνλ κ² λ³΄λ€ μ§κ΄μ μ΄λ€.
removeNonUppercase :: String -> String
removeNonUppercase str = [ c | c <- str, c `elem` ['A'..'Z']]
μμ
μλμ μ μλ addThree ν¨μλ μΈ κ°μ μ μλ₯Ό μΈμλ‘ λ°μ
μΈ μ μμ ν©μ κ³μ°νμ¬ λ°ννλ€.
λ°λΌμ ν¨μμ μ νμ μΈ κ°μ μ μ μ ν(Int)λ₯Ό μ¬μ©νκ³ , λ°νκ° λν μ μ μ ν(Int) μμ
μμν΄μΌ νλ€.
addThree :: Int -> Int -> Int -> Int
addThree x y z = x + y + z
λ§€κ°λ³μλ€μ μ νμ ->λ‘ κ΅¬λΆνλ©°, λ°νκ°μ μ νμ 맨 λ§μ§λ§μ λͺ
μνλ€.
μ£Όμμ¬ν
ν¨μμ κΈ°λ₯μ μ νμ μλμ κ°μ΄ μμ±ν μλ μμ§λ§ μλ°νκ² λ§νλ©΄ λ€λ₯Έ μ νμ΄λ€. μ΄μ λ μ°¨μ°¨ μκ²λ κ²μ΄λ€.
(Int, Int, Int) -> Int
μμ μ΄ν΄ 보μλ―μ΄ ν¨μλ₯Ό μ μν λ μ νμ μ νν λͺ¨λ₯΄κ² λ€λ©΄ λ¨Όμ μ ν μ μΈ μμ΄ ν¨μλ₯Ό μμ±ν λ€μμ
:t λͺ
λ Ήλ¬Έμ μ΄μ©νμ¬ ν¨μμ μ νμ νμΈν μ μλ€.
1, 2, 3 λ± μ μλ€μ μ νμ΄λ©°, μ΅μκ°κ³Ό μ΅λκ°μΌλ‘ μ νλ ꡬκ°μ ν¬ν¨λ μ μλ€μ λμμΌλ‘ νλ€.
addThree 3 5 7
μ£Όμμ¬ν: μ΄λ λ― μ νλ ꡬκ°μ κ°μ κ°λ μ νμ μ΅μκ°κ³Ό μ΅λκ°μ
minBound μ maxBound ν¨μλ₯Ό μ΄μ©νμ¬ νμΈν μ μλ€.
μλ₯Ό λ€μ΄, Int νμ κ²½μ° μ΅μκ°κ³Ό μ΅λκ°μ λ€μκ³Ό κ°μ΄ νμΈνλ€.
(minBound::Int)
(maxBound::Int)
λλ€λ₯Έ μ μλ€μ μ νμ΄λ€.
νμ§λ§ Intμ λ¬λ¦¬ Integerμ μν μ μλ μ νλμ§ μλλ€.
μ¦, μμ² ν° μ«μλ₯Ό λ€λ€μΌ νλ κ²½μ° μ¬μ©νλ€.
μλ₯Ό λ€μ΄, μλ factorial ν¨μλ κ³μΉκ³Ό κ°μ΄ λ§€μ° ν° μλ₯Ό κ³μ°νκΈ°μ Integer μ νμ μ¬μ©νλ€.
factorial :: Integer -> Integer
factorial n = product [1..n]
factorial 50
μ£Όμμ¬ν: Int μ νμ μν μ μλ₯Ό λ€λ£¨λ μΌμ΄ λ³΄λ€ λΉ λ₯΄κ³ ν¨μ¨μ μ΄κΈ°μ, κ·Έλ κ² ν° μ μλ₯Ό λ€λ£° νμκ° μλ€λ©΄
Int μ νμ΄ κΆμ₯λλ€.
λ¨ μ λ°λ(single precision)λ₯Ό κ°λ λΆλμμμ λ€μ μ νμ΄λ€.
μμ ν¨μλ λ°μ§λ¦μ΄ μ£Όμ΄μ‘μ λ μμ λλ λ₯Ό κ³μ°νλ€.
circumference :: Float -> Float
circumference r = 2 * pi * r
circumference 4.0
μ°Έκ³
λ λ°°μ μ λ°λλ₯Ό κ°μ§ λΆλμμμ λ€μ μ νμ΄λ€. μλ μμ λ₯Ό ν΅ν΄ λ¨ μ λ°λλ₯Ό μ¬μ©ν λμ λ°° μ λ°λλ₯Ό μ¬μ©ν λμ μ°¨μ΄λ₯Ό νμΈν μ μλ€.
circumference' :: Double -> Double
circumference' r = 2 * pi * r
circumference' 4.0
:t True
(1 == 2) λ False μ λμΉμΈ ννμμ΄λ€.
:t (1 == 2)
λ¬Έμλ€μ μ νμ΄λ©°, ν€λ³΄λ μμμ 보μ΄λ λ¬Έμ λΏλ§ μλλΌ μ λμ½λ(Unicode)μ ν¬ν¨λ
λͺ¨λ λ¬Έμκ° μ΄ μ νμ κ°λλ€. λ¬Έμλ μμ λ°μ΄ν(')λ‘ κ°μΈμ ΈμΌ νλ€.
:t 'A'
μ£Όμμ¬ν
")λ‘ κ°μΈμ΄λ©΄ λ¬Έμμ΄, μ¦ λ¬Έμ 리μ€νΈλ‘ μΈμλλ€. :t "A"
μμ μ΄ν΄λ³Έ κΈ°λ³Έ μ νλ€μ μ¬μ©λλ κ°λ€μ μμ‘΄νμ§ μλλ€. λ°λ©΄μ 리μ€νΈ μ νκ³Ό νν μ νμ νλͺ©μ μ νμ λ°λΌ μ νμ΄ λ¬λΌμ§λ€. μ¦, 무νν λ§μ 리μ€νΈ μ νκ³Ό νν μ νμ΄ μ‘΄μ¬νλ€.
:t ['a','b','c']
:t [True, False, 1 == 2, True || 2 == 2]
:t ('a', 'b', True)
:t ('a', 'b')
μ΄μ κ°μ΄ 무μν λ§μ μ νμ κ³ μ λ νμμΌλ‘ νννκΈ° μν΄ μ ν λ³μ(type variable) λ₯Ό νμ©νλ€.
μλ₯Ό λ€μ΄, μμμ 리μ€νΈμ ν¨κ» νΈμΆνλ©΄
head λ
μ£Όμ΄μ§ 리μ€νΈμ 머리(head)λ₯Ό λ°ννλ€.
λ°λΌμ μμμ μ νμ 리μ€νΈλ₯Ό λ€λ£° μ μμ΄μΌ νλ€.
head ν¨μμ μ νμ λ€μκ³Ό κ°λ€.
:t head
headμ μ νμ μ½λ λ°©μμ λ€μκ³Ό κ°λ€.
μμμ μ ν aμ λν΄, μ ν aμ κ°μΌλ‘ μ΄λ£¨μ΄μ§ 리μ€νΈκ° μΈμλ‘ λ€μ΄μ€λ©΄ a μ νμ κ°μ λ°ννλ€.
μλ₯Ό λ€μ΄, μ μ 리μ€νΈκ° μΈμλ‘ λ€μ΄μ€λ©΄ μ μλ₯Ό λ°ννκ³ , λ¬Έμμ΄μ΄ λ€μ΄μ€λ©΄ λ¬Έμκ° λ°νλλ€.
μ΄λ λ― aλ μμμ μ νμ λλ³νλ μν μ μννλ μ ν λ³μμ΄λ€.
μ£Όμμ¬ν
a, b, c, d λ±μΌλ‘ μ΄λ¦μ λΆμΈλ€. κΈΈμ΄κ° 2μΈ ννμμ 첫 λ²μ§Έ νλͺ©μ λ°ννλ ν¨μ
fstμ
μ νλ λΉμ·ν λͺ¨μμ κ°λλ€.
:t fst
fstμ μ νμ μ½λ λ°©μμ λ€μκ³Ό κ°λ€.
μμμ μ ν aμ bμ λν΄, a μ νμ κ°κ³Ό b μ νμ κ°μΌλ‘ μ΄λ£¨μ΄μ§ κΈΈμ΄κ° 2μΈ νν μΈμλ‘ λ€μ΄μ€λ©΄ a μ νμ κ°μ λ°ννλ€.
μ£Όμμ¬ν
aμ b λ μ ν λ³μ μ΄λ¦μ΄ λ€λ₯Έ μ΄μ λ κ° λ³μ λμ μ μλ‘ λ€λ₯Έ μ νμ λμ
ν΄μ μ¬μ©ν μ μλ€λ μλ―Έμ΄λ€.
νμ§λ§, λ λ³μ λͺ¨λ λμΌν μ νμ κ°λ¦¬μΌλ λλ€. fst ν¨μμ μ§μ μ΄λ£¨λ
snd ν¨μμ
μ νμ λ€μκ³Ό κ°μ΄ λ°νκ°μ μλ£νμ΄ bλ‘ νμλλ€.
:t snd
sndμ μ νμ μ½λ λ°©μμ λ€μκ³Ό κ°λ€.
μμμ μ ν aμ bμ λν΄, a μ νμ κ°κ³Ό b μ νμ κ°μΌλ‘ μ΄λ£¨μ΄μ§ κΈΈμ΄κ° 2μΈ νν μΈμλ‘ λ€μ΄μ€λ©΄ b μ νμ κ°μ λ°ννλ€.
head, fst, snd μ΄μΈμ tail, last, init λ±
리μ€νΈμ νν κ΄λ ¨ λ§μ ν¨μλ€μ΄ λͺ¨λ μλ λͺ¨μμ μ νμ κ°λλ€.
forall a b c. ...
μ λͺ¨μμ μ νμ κ°λ ν¨μλ₯Ό λ€ν ν¨μ(polymorphic functions), μμ κ°μ΄ λ€νν¨μλ₯Ό μ§μνλ κΈ°λ₯μ λ€νμ±(polymorphism) μ΄λΌ λΆλ₯Έλ€. μμ μ΄ν΄λ³΄μλ―μ΄ λ€νμ±μ νμ©νμ¬ μ¬λ¬ μ νμ λν΄ μλνλ λ³΄λ€ μΌλ°νλ ν¨μλ₯Ό μ μν μ μλ€.
μ£Όμμ¬ν: C++, μλ°, νμ΄μ¬ λ±μ μΈμ΄μμ μ§μνλ μ λ€λ¦(generic) ν΄λμ€ κ°λ μ΄ λ°λ‘ μ΄ λ€νμ±μ μμ©ν κ²μ΄λ€.
μ νν΄λμ€(typeclass) λ μ νμ΄ κ°μ ΈμΌ νλ μ±μ§κ³Ό κΈ°λ₯μ λ¬μ¬νλ μΌμ’ μ μΈν°νμ΄μ€(interface) μ΄λ€. νΉμ μ νμ΄ μ΄λ€ μ νν΄λμ€κ° λ¬μ¬νλ μ±μ§κ³Ό κΈ°λ₯μ λͺ¨λ κ°μ§ λ, ν΄λΉ μ νμ΄ κ·Έ μ νν΄λμ€μ μνλ€ λΌκ³ λ§νλ€.
μ°Έκ³
μ νν΄λμ€λ₯Ό μ΄ν΄νκΈ° μν΄
λμΉμ±(equality)μ κ²μ¬νλ ν¨μ
== μ
μ νμ μ΄μ©ν΄λ³΄μ.
:t (==)
head, fst λ±κ³Όλ λ€λ₯΄κ², 'Eq a =>' λΆλΆμ΄ μΆκ°λμλ€.
κΈ°νΈ => μΌνΈμ λͺ
μλ λΆλΆμ ν΄λΉ ν¨μμ μΈμλ€μ΄ λ§μ‘±μμΌμΌ νλ ν΄λμ€ μ μ½(class constraint) μ λνλΈλ€.
μλ₯Ό λ€μ΄, λμΉμ± κ²μ¬ ν¨μ (==)μ μ¬μ©λλ λ μΈμ λͺ¨λ Eq μ νν΄λμ€μ μνλ μ ν aμ κ°μ΄μ΄μΌ ν¨μ
μ μ νμΌλ‘λΆν° μ μ μλ€.
μ€μ λ‘ (==)μ μ νμ μλ―Έλ λ€μκ³Ό κ°λ€.
Eq ν΄λμ€μ μνλ μμμ μ ν aμ λν΄, a μ νμ κ° λ κ°λ₯Ό μΈμλ‘ λ°μΌλ©΄ λΆμΈκ°μ λ°ννλ€.
μ¦, "Eq ν΄λμ€μ ν¬ν¨λλ μ ν" μ΄λΌλ μ‘°κ±΄μ΄ νμ©λλ μ νμ μ μ½νλ€.
μ€μ λ‘ λ κ°μ λμΉμ±μ κ²μ¬νλ €λ©΄ μ°μ μ μΌλ‘ λ κ°μ΄ λμΌν κ°μ λνλ΄λμ§ μ¬λΆλ₯Ό κ²μ¬ν μ μμ΄μΌ νλ€.
μλ₯Ό λ€μ΄, λ μ μμ λμΉμ±, λ λ¬Έμμ λμΉμ±, λ μ§λ¦¬κ°μ λμΉμ±μ κ²μ¬κ° κ°λ₯νλ€.
λ°λ©΄μ λ ν¨μμ λμΉμ±μ κ²μ¬κ° λΆκ°λ₯νλ°,
μ΄λ νλ§μ
μ μ§λ¬Έμ (Turing's Halting Problem)λ₯Ό
μ΄μ©νμ¬ μ¦λͺ
ν μ μλ€λ μ¬μ€ μ λλ§ κΈ°μ΅ν΄ λκΈ° λ°λλ€.
μ°Έκ³ : λμ€μ μκ°ν
IO λΌλ
μ
μΆλ ₯ μ²λ¦¬ μ νκ³Ό ν¨μμ μ νμ μ μΈν λͺ¨λ νμ€ νμ€μΌ μ νμ Eq μ νν΄λμ€μ ν¬ν¨λλ€.
ν΄λμ€ μ μ½ 'Eq a'λ₯Ό μ¬μ©νλ λ λ€λ₯Έ ν¨μλ μλ₯Ό λ€μ΄ 리μ€νΈμ νΉμ κ° ν¬ν¨μ¬λΆλ₯Ό κ²μ¬νλ
elem ν¨μμ΄λ€.
:t elem
κ·Έλ°λ° elemμ μ νμ λ³΄λ€ λ³΅μ‘νκ³ , λͺ¨λ λ΄μ©μ μ¬κΈ°μ μ€λͺ
νκΈ°μλ 무리μ΄λ€.
λ¨μν μ€λͺ
μ μν΄ μλ λ μ¬νμ κ³ λ €νμ.
t a: [a]λ‘ μ΄ν΄ν κ².Foldable t: μ¬κΈ°μ 무μ.κ·Έλ¬λ©΄ elemμ μ νμ μλμ κ°μ΄ μ΄ν΄λλ€.
elem :: forall a. Eq a => a -> [a] -> Bool
μ¦, elem ν¨μ λν Eq ν΄λμ€μ μνλ μμμ μ ν aμ κ°μΌλ‘ μ΄λ£¨μ΄μ§ 리μ€νΈμ
λν΄μλ§ νΉμ κ°μ ν¬ν¨μ¬λΆλ₯Ό κ²μ¬νλ€.
μ¬μ€ νΉμ κ°μ΄ 리μ€νΈμ ν¬ν¨λμλμ§λ₯Ό κ²μ¬νλ €λ©΄ 리μ€νΈμ ν¬ν¨λμ΄ μλ λͺ¨λ νλͺ©κ³Όμ λμΉμ± κ²μ¬κ° κ°λ₯ν΄μΌ ν¨μ
μ½κ² μ΄ν΄ν μ μλ€.
μ μ νμ μ΄λ° λ΄μ©μ μ ννκ² λ°μνκ³ μλ€.
Eq 유형클래스¶Eq μ νν΄λμ€λ
λμΉμ±μ κ²μ¬νλ ν¨μ
==μ
λΉλμΉμ±μ κ²μ¬νλ ν¨μ
/=μ
μ νκ³Ό νΉμ±μ μ§μ νλ μΈν°νμ΄μ€(interface)λ₯Ό μ 곡νλ€.
μ¦, Eq μ νν΄λμ€μ ν¬ν¨λλ μ νμ λμΉμ±κ³Ό λΉλμΉμ± κ²μ¬λ₯Ό λͺ¨λ νμ©νλ©°,
Eq a ν΄λμ€ μ μ½μ μ¬μ©νλ ν¨μλ μ μ λΆλΆ μ΄λκ°μμ λμΉμ± λλ λΉλμΉμ± κ²μ¬λ₯Ό μ¬μ©ν¨μ μλ―Ένλ€.
μ°Έκ³ : Eq μ νν΄λμ€λ₯Ό ν¬ν¨ν νμ€μΌμ κΈ°λ³Έ μ νν΄λμ€μ μ νν μ μλ
μ μ ν λμ μ΄ν΄λ³Ό κ²μ΄λ©°, μ¬κΈ°μλ μΌλ¨ μ νν΄λμ€μ μν λ§μ μ‘°λͺ
νλ€.
μμ μΈκΈνλλ‘ μ§κΈκΉμ§ μ΄ν΄λ³Έ μ ν μ€μμ ν¨μμ μ νμ μ μΈν λͺ¨λ μ νμ Eq μ νν΄λμ€μ μνλ€.
5 == 5
5 /= 5
'a' == 'a'
"Ho Ho" == "Ho Ho"
3.432 == 3.432
Ord μ νν΄λμ€μ μνλ μ νμ κ°λ€μ μλ‘ ν¬κΈ° λΉκ΅λ₯Ό ν μ μλ€.
ν¨μμ μ νμ μ μΈν μ§κΈκΉμ§ λ€λ£¬ λͺ¨λ μ νμ Ord μ νν΄λμ€μ μνλ€.
Ord λ μΌλ°μ μΌλ‘ μ¬μ©λλ λͺ¨λ λΉκ΅ ν¨μλ₯Ό μΈν°νμ΄μ€λ‘ μ 곡νλ€.
μλ₯Ό λ€μ΄, < ν¨μμ μ νμ λ€μκ³Ό κ°λ€.
:t (>)
μ μ νμ > ν¨μλ Ord μ νν΄λμ€μ μν μ νμ λν΄μλ§ μλνλ€λ κ²μ μλ―Ένλ€.
μ΄κ²μ λ€λ₯΄κ² νννλ©΄, νΉμ μ ν aκ° Ord μ νν΄λμ€μ ν¬ν¨λλ €λ©΄
μλ μ νμ κ°λ ν¨μλ₯Ό μ μν μ μμ΄μΌ νλ€λ κ²μ λνλΈλ€.
a -> a -> Bool
μ νν΄λμ€μ ν¬ν¨λ ν¨μμ μ νμ΄ ν΄λΉ μ νν΄λμ€λ₯Ό ν΄λμ€ μ μ½μΌλ‘ κ°λ κ²μ μμΈν μλ―Έλ μ΄νμ λ³΄λ€ μμΈν μ€λͺ νλ€.
<=, >=, compare ν¨μλ₯Ό ν΅ν΄ μ μ μλ―μ΄
Ordμ λ©€λ²κ° λκΈ° μν΄μλ λ¨Όμ Eqμ ν¬ν¨λμ΄ μμ΄μΌ νλ€.
compare ν¨μλ ν¬κΈ° λΉκ΅κ° κ°λ₯ν λ κ°μ μΈμλ‘ λ°μΌλ©΄
첫째 μΈμκ° λμ§Έ μΈμλ³΄λ€ ν°μ§(GT), μμμ§(LT), μλλ©΄ κ°μμ§(EQ)λ₯Ό
κ²μ¬νμ¬ νλ¨ν κ²°κ³Όλ₯Ό λ°ννλ€.
"Abrakadabra" < "Zebra"
5 >= 2
"Abrakadabra" `compare` "Zebra"
compare 5 3
compare (2, 3) (1+1, 5-2)
Show μ νν΄λμ€μ μνλ μ νμ κ°μ (ν°λ―Έλ) νλ©΄μ λ¬Έμμ΄λ‘ νμν μ μμΌλ©°,
ν¨μλ₯Ό μ μΈν λͺ¨λ μ νμ Showμ ν¬ν¨λλ€.
Show μ νν΄λμ€κ° μ 곡νλ μΈν°νμ΄μ€μ μνλ ν¨μλ showμ΄λ©°,
Show μ μνλ μ νμ κ°μ λ¬Έμμ΄λ‘ λ³νμν¨λ€.
show 3
show 5.334
show True
μ°Έκ³ : show ν¨μλ₯Ό ꡬννλ€λ κ²μ νμ΄μ¬ ν΄λμ€μ __str__() λλ __repr()__ λ©μλμ
μ μ¬ν κΈ°λ₯μ μννλ€. μλ° ν΄λμ€μ toString() λ©μλμ κΈ°λ₯λ ν¬κ² λ€λ₯΄μ§ μλ€.
Showμ λμλλ ν΄λμ€μ΄λ©°,
read ν¨μλ₯Ό
μΈν°νμ΄μ€λ‘ μ 곡νλ€.
μ§κΈκΉμ§ λ€λ€μ§ λͺ¨λ μ νμ Show μ νν΄λμ€μ μνλ€.
read ν¨μλ λ¬Έμμ΄μ Read ν΄λμ€μ μνλ μ μ ν μ νμ κ°μΌλ‘ λ³νμμΌμΌ νλ€.
read "True"λ λΆμΈ μλ£νμ Trueλ‘ κ³μ°λλ€.read "True" || False
read "8.2"λ, μλ₯Ό λ€μ΄, Float μ νμ 8.2λ‘ κ³μ°λλ€.Float, Double λ± μ¬λ¬ μ’
λ₯μ λΆλμμμ μ νμ΄ μ‘΄μ¬νκΈ°μ 'μλ₯Ό λ€μ΄' ννμ μ¬μ©νμμμ μ£ΌμνλΌ.read "8.2" + 3.8
read "5"λ, μλ₯Ό λ€μ΄, Int μ νμ 5λ‘ κ³μ°λλ€.Int, Integer λ± μ¬λ¬ μ’
λ₯μ μ μ μ νμ΄ μ‘΄μ¬νκΈ°μ 'μλ₯Ό λ€μ΄' ννμ μ¬μ©νμμμ μ£ΌμνλΌ.read "5" - 2
read "[1,2,3,4]"λ, μλ₯Ό λ€μ΄, [Int] μ νμ [1,2,3,4]λ‘ κ³μ°λλ€.read "[1,2,3,4]" ++ [3]
μ£Όμ!
read "True" λλ read "5"λ₯Ό μ€ννλ©΄ μ€λ₯κ° λ°μνλ€.
read "True"
read "5"
no parse ννμ GHCκ°
λ¬Έμμ΄ "5"λ₯Ό μ΄λ μ νμ κ°μΌλ‘ νμ±(λ¬Έμ₯λΆμ, parsing)ν΄μΌν μ§ λͺ
ννμ§ μλ€λ μλ―Έμ΄λ€.
λ°λ©΄μ, μλ₯Ό λ€μ΄, read "5" - 2μ κ²½μ°λ - 2κ° ν¨κ» μ¬μ©λκΈ°μ
λΊμ
μ μ§μνλ μ μ λλ λΆλμμμ μ νμΌλ‘ νλ¨νλ κ²μ΄ κ°λ₯νλ€.
λ¬Όλ‘ μ νν μ΄λ€ μ νμΈμ§ νλλ₯Ό μ ν μλ μλ€.
νμ§λ§ λΊμ
μ μ§μ νλ μ νμ λͺ¨λ Num μ΄λΌλ μ νν΄λμ€μ μνλ€.
λ°λΌμ μλμ κ²°κ³Όλ₯Ό μ»κ² λλ€.
:t (read "5" - 2)
μ¦, (read "5" - 2)λ λ€ν μ νμ κ°μ§λ©°, ν΄λΉ λ€ν μ νμ μλ―Έλ λ€μκ³Ό κ°λ€.
Num μ νν΄λμ€μ Read μ νν΄λμ€ λͺ¨λμ μνλ μμμ μ ν aλ (read "5" - 2)λ₯Ό κ°μΌλ‘ κ°λλ€.
read ν¨μ λ¨λ
μΌλ‘ λ°νκ°μ μ νμ μΆλ‘ ν μ μλ μ΄μ λ μ νμΌλ‘λ νμΈν μ μλ€.
:t read
μ¦, read ν¨μκ° μ ν λ³μ a μ μ΄λ€ μ νμ λμ
ν μ§ read ν¨μ μ체λ§μΌλ‘λ μ μ μλ€.
νμ§λ§ μ νμ μΌλͺ
μ ν μ£Όμ(type annotations) ννλ‘ λͺ
μνλ©΄
μ ν μΆλ‘ μ΄ κ°λ₯ν΄μ§λ€.
μ ν μ£Όμμ μΆκ°νλ λ°©μμ μλμ κ°λ€.
read "5" :: Int
read "5" :: Float
(read "5" :: Float) * 4
read "[1,2,3,4]" :: [Int]
read "(3, 'a')" :: (Int, Char)
μ°Έκ³ :
ννμ μ νμ λλΆλΆ νμ€μΌ μ»΄νμΌλ¬ μ€μ€λ‘ μΆλ‘ ν μ μλ€κ³ μ΄μ μ μΈκΈνμλ€.
νμ§λ§ Read "5" μ κ°μ ννμμ κ²½μ°μ²λΌ μ νμ κ²°μ ν μ μλ κ²½μ°κ° λ°μνλ©°,
κ·Έλ° κ²½μ°μλ μ€λ₯ λ°μμ λλΉν΄ μ ν μ£Όμμ νμ©ν΄μΌ νλ€.
Enum μ νν΄λμ€μ μνλ μ νμ κ°λ€μ ν¬κΈ° μμλλ‘ μ΄κ±°(enumeration)λ μ μμ΄μΌ νλ€.
κ°μ μ΄κ±°ν μ μλ€μ μλ―Έλ νλμ κ°μ΄ μ£Όμ΄μ‘μ λ κ·Έ κ°μ μ΄μ κ°(predecessor)κ³Ό
λ€μκ°(successor)μ μ§μ ν μ μλ€λ μλ―Έμ΄λ€.
λ€μκ°κ³Ό μ΄μ κ°μ κ°κ°
succ ν¨μμ
pred ν¨μλ₯Ό
μ¬μ©ν΄ μ»μ μ μλ€.
μλ₯Ό λ€μ΄, μμ μ μ 1μ μ΄μ κ°μ 0μ΄κ³ , λ€μκ°μ 2μ΄λ©°, λ¬Έμ cμ μ΄μ κ°μ b, λ€μκ°μ dμ΄λ€.
λ°λ©΄μ λ¬Έμμ΄ "cde"μ μ΄μ κ°κ³Ό λ€μκ°μ μ μ μλ€.
μ¦, λ¬Έμμ΄ μ ν Stringμ Enum μ νν΄λμ€μ ν¬ν¨λμ§ μλλ€.
μ€μ λ‘ μμμ μ ν aμ λν΄, [a]λ Enum μ νν΄λμ€μ ν¬ν¨λμ§ μλλ€.
succ 1
pred 1
succ 'c'
pred 'c'
μ νμ λ°λΌ νΉμ κ°μ μ΄μ κ° λλ λ€μκ°μ΄ μ‘΄μ¬νμ§ μλλ€.
μλ₯Ό λ€μ΄, Ordering μ νμ LTλ μ΄μ κ°μ΄, GTλ μ΄ν κ°μ κ°μ§ μλλ€.
pred LT
pred EQ
succ EQ
succ GT
λλ‘κ²λ Floatμ Double λν Enum μ νν΄λμ€μ μνλ€.
μ¬μ€ μνμ μΌλ‘ μ 리μλ μ΄κ±°λ μ μλ€.
μλ₯Ό λ€μ΄, 0.1 λ°λ‘ λ€μμ μ 리μλ μνμ μΌλ‘ μ‘΄μ¬νμ§ μλλ€.
νμ§λ©΄ νμ€μΌμ 1μ λΉΌκ±°λ λν κ°μ μ΄μ κ°κ³Ό λ€μκ°μΌλ‘ μ¬μ©νλ€.
succ 0.1
pred 0.1
Enum μ νν΄λμ€μ κ°μ₯ ν° νμ©μ±μ λ μΈμ§(range)μ΄λ€.
μ΄μ κ°κ³Ό λ€μκ°μ΄ μ§μ λμ΄ μμ λ μ΄λμμ μ΄λκΉμ§ λΌλ ννμ΄
μλ―Ένλ λ°λ₯Ό λ μΈμ§κ° μ ννκ² λ°μνλ€.
['a'..'e']
[LT .. GT]
[3 .. 5]
succ 'B'
μ£Όμμ¬ν: μ νλ³ minBoundμ maxBoundλ₯Ό νμΈν λ
μλ μκ΄νΈλ₯Ό μ¬μ©ν νμκ° μμ§λ§, μ£ΌνΌν° λ
ΈνΈλΆ μ
μμ μμ±νλ κ²½μ° μκ΄νΈλ₯Ό ν¨κ» μ¬μ©νμ§
μμΌλ©΄ μ€λ₯κ° λ°μνλ€.
μμ μ μ»΄ν¨ν°μμ μ§μνλ μ΅μμ/μ΅λμ Intμ ν μ μλ λ€μκ³Ό κ°λ€.
(minBound :: Int)
(maxBound :: Int)
λ¬Έμμ μ΅μκ°κ³Ό μ΅λκ°μ μλμ κ°λ€.
(minBound :: Char)
(maxBound :: Char)
μ§λ¦¬κ°μ μ΅μκ°κ³Ό μ΅λκ°μ μλμ κ°λ€.
(maxBound :: Bool)
(minBound :: Bool)
Boundedμ μνλ μ νμΌλ‘λ§ μ΄λ£¨μ΄μ§ νν μ ν λν Bounded μ νν΄λμ€μ μνλ€.(maxBound :: (Bool, Int, Char))
μ(number)λ‘ μ·¨κΈλ μ μλ κ°λ€μ μ νμ΄ μνλ μ νν΄λμ€μ΄λ€.
μ°λ¦¬κ° μΌμμ μΌλ‘ μ¬μ©νλ μλ Num μ νν΄λμ€μ μνλ λ€μν μ νμ κ°μ΄λ€.
μλ₯Ό λ€μ΄, 20μ Num μ νν΄λμ€μ μνλ μμμ μ νμ μνλ€.
:t 20
λ°λΌμ Num μ νν΄λμ€μ μνλ λͺ¨λ μ νμ κ°μΌλ‘ μ·¨κΈλ μ μλ€.
μλ₯Ό λ€μ΄ λ€μκ³Ό κ°λ€.
20 :: Int
20 :: Integer
20 :: Float
20 :: Double
μμ μ°μ°κ³Ό κ΄λ ¨λ ν¨μλ κΈ°λ³Έμ μΌλ‘ Num μ νν΄λμ€μ μνλ μ νλ§μ λμμΌλ‘ νλ€.
μλ₯Ό λ€μ΄, *μ μ νμ νμΈν΄λ³΄μ.
:t (*)
μ¦, κ³±μ
μ°μ°μ(*)λ Num μ νν΄λμ€μ μνλ μ νμ λν΄μλ§ μλνλ©°,
μ¬μ©λλ λ μΈμμ μ νμ΄ λμΌν΄μΌ νλ€.
μλ₯Ό λ€μ΄ μλ ννμμ κ³μ°μ μ€λ₯λ₯Ό λ°μμν€λλ°, μ΄μ λ λ κ°μ μ νμ΄ λ€λ₯΄κ² μ§μ λμκΈ° λλ¬Έμ΄λ€.
(5 :: Int) * (6 :: Integer)
λ°λ©΄μ μλ ννμμ κ³μ°μ μ μλνλ€.
μ΄μ λ 5μ μ νμ΄ λ¬Έλ§₯μ Integerλ‘ μ§μ λ μ μκΈ° λλ¬Έμ΄λ€.
5 * (6 :: Integer)
Fractional 유형클래스¶λλμ
κ³Ό κ³±μ
μ μμν¨μμ λν΄ λ«ν μλ μ νμ ν΄λμ€μ΄λ€.
Floatμ Doubleμ΄ μ¬κΈ°μ μνλ€.
μ μμ κ΄λ ¨λ μ νμΈ Intμ Integerκ° μ¬κΈ°μ ν¬ν¨λλ€.
λ³΄λ€ μλ°νκ²λ λͺ«κ³Ό λλ¨Έμ§ μ°μ°μ μ§μνλ μ νλ€μ΄μ΄μΌ νλ€.
log, exp, sin, cos λ± μ μ λ²μλ₯Ό λμ΄μλ μ°μ°μ λ€λ£° μ μλ μ νλ€μ΄ μνλ€.
λνμ μΌλ‘ Float, Doubleμ΄ μλ€.
μμ κ΄λ ¨λ μ νν΄λμ€λ₯Ό μ΄ν΄λ³΄μμΌλ μ΄μ μλ₯Ό λ€λ£¨λ ν¨μλ€μ μ’ λ ꡬ체μ μΌλ‘ μ΄ν΄ν μ μλ€.
μ¬μ€ μμΉ ν¨μλ€μ κ½€ 볡μ‘ν μ νμ κ°λλ€.
μ¬κΈ°μλ μ€λͺ
μ μν΄
fromIntegral
ν¨μλ₯Ό μ΄μ©νλ€.
λ¨Όμ μ νμ νμΈν΄λ³΄μ.
:t fromIntegral
λ¨Όμ , μ νμ μ¬μ©λλ ν΄λμ€ μ μ½μ΄ λ κ°μμ΄λ©°, μκ΄νΈ μμμ μΌνλ‘ κ΅¬λΆλμ΄ μμμ μ£Όλͺ©ν΄μΌ νλ€.
Integral μ νν΄λμ€μ μνλ μ ν aμ κ°Num μ νν΄λμ€μ μνλ μ ν bμ κ°μ¦, fromIntegral ν¨μλ μ μν μλ₯Ό μμμ μ νμ μλ‘ λ³νμμΌμ£Όλ©°,
μλ μμ μ κ°μ κ²½μ°μ μ μ©νκ² νμ©λλ€.
μμ
리μ€νΈμ κΈΈμ΄λ₯Ό λ°ννλ length ν¨μμ μ νμ λ€μκ³Ό κ°λ€.
:t length
μ΄μ μ elem ν¨μμ μ νμμ μΈκΈν λλ‘ μλ λ μ¬νμ μ μ©ν΄λ³΄μ.
t a: [a]λ‘ μ΄ν΄ν κ².Foldable t: μ¬κΈ°μ 무μ.κ·Έλ¬λ©΄ lengthμ μ νμ μλμ κ°μ΄ μ΄ν΄λ μ μλ€.
forall a. [a] -> Int
μ¬κΈ°μ μ£Όλͺ©ν΄μΌν μ¬νμ λ°νκ°μ μ νμ΄ Int λΌλ κ²μ΄λ€.
μλ§λ μλμ κ°μ΄ νλ©΄ λ μ’μμν
λ° μ΄λ€ μμ¬μ μΈ μ΄μ μμ Int λ‘ μ ν΄μ‘λ€.
forall a. Num b => [a] -> b
μ΄λ° μ΄μ λ‘ ν΄μ μλμ κ°μ κ²½μ° λ¬Έμ κ° λ°μνλ€.
length [1,2,3,4] + 3.2
μ΄μ λ 4 :: Int μ λΆλμμμ 3.2κ° μλ‘ μ νμ΄ λ€λ₯΄κΈ° λλ¬Έμ΄λ€.
μ΄λ° κ²½μ° fromIntegral ν¨μλ₯Ό νμ©νλ©΄ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€.
fromIntegral (length [1,2,3,4]) + 3.2
μ΄μ λ fromIntegral ν¨μμ μν΄ 4 :: Intκ° μμμ Num μ νν΄λμ€μ μνλ μ νμΌλ‘ λ³νλ μ μκΈ° λλ¬Έμ΄λ€.