μλ μ£ΌνΌν° λ ΈνΈλΆμ 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
μ νν΄λμ€μ μνλ μ νμΌλ‘ λ³νλ μ μκΈ° λλ¬Έμ΄λ€.