3장 유형과 유형클래스

μ•„λž˜ μ£Όν”Όν„° λ…ΈνŠΈλΆμ€ James Brock의 learn-you-a-haskell-notebook을 κΈ°λ³Έν‹€λ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€.

μ°Έκ³ : λ¦°νŒ…(linting) κΈ°λŠ₯ 끄기

  • λ¦°νŒ…(linting): IHaskellμ—μ„œ HLint라고 λΆˆλ¦¬λŠ” λ¦°ν„°(linter)에 μ˜ν•΄ 보닀 μ μ ˆν•˜λ‹€κ³  νŒλ‹¨ν•˜λŠ” ν‘œν˜„μ‹μ„ μ œμ•ˆν•˜λŠ” κΈ°λŠ₯
  • 보닀 μ„Έλ ¨λœ ν‘œν˜„μ‹(expression)을 μ œμ•ˆν•˜λŠ” λ„κ΅¬μž„. ν•˜μ§€λ§Œ λ°˜λ“œμ‹œ ν•„μš”ν•œ κΈ°λŠ₯은 μ•„λ‹ˆλ‹€
  • μ°Έμ‘°: IHaskell의 λ¦°νŒ… κΈ°λŠ₯ μ„€μ •ν•˜κΈ°
In [1]:
:opt no-lint

μ°Έκ³ : μ£Όν”Όν„°λž© 단좕킀

μ£Όν”Όν„°λž©μ—μ„œ κ°€μž₯ μœ μš©ν•œ 단좕킀 쑰합은 λ‹€μŒκ³Ό κ°™λ‹€.

단좕킀 μ‘°ν•© μ‹€ν–‰κ²°κ³Ό
Shift+Enter μ„ νƒν•œ 셀을 μ‹€ν–‰ν•˜κ³  λ‹€μŒ μ…€λ‘œ 이동
Ctrl+Enter μ„ νƒν•œ 셀을 μ‹€ν–‰. λ‹€μŒ μ…€λ‘œ μ΄λ™ν•˜μ§€ μ•ŠμŒ
Alt+Enter μ„ νƒν•œ 셀을 μ‹€ν–‰ν•˜κ³  μ„ νƒν•œ μ…€ 뒀에 μƒˆλ‘œμš΄ μ…€ μ‚½μž…
Enter μ„ νƒν•œ μ…€ νŽΈμ§‘
Ctrl+Shift+- μ»€μ„œ μœ„μΉ˜μ—μ„œ μ…€ λΆ„ν• 

λͺ¨λ“  κ°€λŠ₯ν•œ 단좕킀 쑰합은 μ™ΌνŽΈ μ‚¬μ΄λ“œλ°”μ— μœ„μΉ˜ν•œ 돋보기 μ•„μ΄μ½˜μ„ 눌러 ν™•μΈν•˜κ±°λ‚˜ 검색할 수 μžˆλ‹€. μ£Όν”Όν„°λž©μ˜ 단좕킀 μ„€μ • 및 μ£Όμš” 단좕킀에 λŒ€ν•œ μžμ„Έν•œ μ„€λͺ…은 μ£Όν”Όν„°λž© μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€.

3.1 유형(Types)

ν•˜μŠ€μΌˆμ€ κ²¬κ³ ν•œ μœ ν˜• 체계λ₯Ό 가진닀. λͺ¨λ“  ν‘œν˜„μ‹μ˜ μœ ν˜•μ€ 컴파일 κ³Όμ •μ—μ„œ κ²°μ •λ˜λ©°, 이둜 인해 μž‘μ„±λœ μ½”λ“œμ˜ μ•ˆμ „μ„±μ΄ 높아진닀. 예λ₯Ό λ“€μ–΄, λΆ€μšΈ μœ ν˜•μ„ μ–΄λ–€ 숫자둜 λ‚˜λˆ„λ €ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λ©΄, 이 ν”„λ‘œκ·Έλž¨μ€ 컴파일쑰차 λ˜μ§€ μ•ŠλŠ”λ‹€. 즉, ν”„λ‘œκ·Έλž¨μ΄ 싀행쀑에 쀑단될 μˆ˜λ„ μžˆλŠ” 였λ₯˜λ₯Ό 일을 컴파일 κ³Όμ •μ—μ„œ 막아낸닀. ν•˜μŠ€μΌˆμ—μ„œ λ‹€λ€„μ§€λŠ” λͺ¨λ“  λŒ€μƒμ€ μœ ν˜•μ„ 갖기에, ν”„λ‘œκ·Έλž¨μ΄ 컴파일 되기 전에 ν”„λ‘œκ·Έλž¨μ— λŒ€ν•œ λ§Žμ€ 정보λ₯Ό μ•Œμ•„λ‚Ό 수 μžˆλ‹€. λ”°λΌμ„œ ν•˜μŠ€μΌˆμ˜ μœ ν˜• 체계λ₯Ό μ΄ν•΄ν•˜λŠ” 일이 맀우 μ€‘μš”ν•˜λ‹€.

유형 추론(type inference)

정적 μœ ν˜• 언어인 C, μžλ°” λ“±κ³ΌλŠ” ν•˜μŠ€μΌˆμ€ 주어진 λŒ€μƒμ˜ μœ ν˜•μ„ μΆ”λ‘ ν•  수 μžˆλ‹€. λ§Œμ•½ 숫자λ₯Ό μž‘μ„±ν•˜λ©΄ ν•˜μŠ·μΌˆ 슀슀둜 그것이 μˆ«μžλΌλŠ” 것을 μΆ”λ‘ (infer) ν•  수 μžˆλ‹€. λ”°λΌμ„œ ν•¨μˆ˜μ™€ ν‘œν˜„μ‹μ˜ μœ ν˜•μ„ 일반적으둜 λͺ…μ‹œν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

μ£Όμ˜μ‚¬ν•­: μ˜ˆμ™Έκ°€ μžˆλ‹€. λ‚˜μ€‘μ— μ‚΄νŽ΄λ³Ό 것이닀.

μœ ν˜•μ€ λͺ¨λ“  ν‘œν˜„μ‹μ΄ κ°–λŠ” μΌμ’…μ˜ 라벨(label)이닀. μœ ν˜•μ€ 주어진 ν‘œν˜„μ‹μ΄ μ–΄λ–€ λΆ€λ₯˜μ— μ†ν•˜λŠ”κ°€μ— λŒ€ν•œ 정보λ₯Ό μ•Œλ €μ€€λ‹€. 예λ₯Ό λ“€μ–΄ TrueλŠ” λΆ€μšΈ(Bool) μœ ν˜•μ„, "hello"λŠ” λ¬Έμžμ—΄ μœ ν˜•μ„ κ°–λŠ”λ‹€.

GHCiλ₯Ό μ‚¬μš©ν•΄ 일뢀 μ‹μ˜ μœ ν˜•μ„ μ‚΄νŽ΄λ³΄μž. :t λͺ…령문을 μ΄μš©ν•˜μ—¬ 주어진 ν‘œν˜„μ‹μ˜ μœ ν˜•μ„ μ•Œμ•„λ³Ό 수 μžˆλ‹€.

  • 더블 콜둠(::)의 의미
    • μ™ΌνŽΈ: (주어진) ν‘œν˜„μ‹
    • 였λ₯ΈνŽΈ: (주어진) ν‘œν˜„μ‹μ˜ μœ ν˜•
    • (주어진) ν‘œν˜„μ‹μ€ "~ μœ ν˜•μ„ κ°–λŠ”λ‹€", "~ μœ ν˜•μ— μ†ν•œλ‹€"둜 μ„€λͺ…함.
  • μœ ν˜•μ€ 항상 λŒ€λ¬Έμžλ‘œ μ‹œμž‘ν•¨.
In [2]:
:t 'a'
'a' :: Char
  • 'a'의 μœ ν˜•: Char.
  • CharλŠ” character 의 μ•½μž.
In [3]:
:t True
True :: Bool
In [4]:
:t "HELLO!"
"HELLO!" :: [Char]
  • "HELLO!"의 μœ ν˜•: [Char]
  • [Char]μ—μ„œ λŒ€κ΄„ν˜ΈλŠ” 리슀트λ₯Ό ν‘œν˜„ν•¨. 즉, [Char]λŠ” 문자둜 κ΅¬μ„±λœ 리슀트λ₯Ό μ˜λ―Έν•¨.
In [5]:
:t (True, 'a')
(True, 'a') :: (Bool, Char)
In [6]:
:t ('a','b','c')
('a','b','c') :: (Char, Char, Char)
  • (True, 'a')의 μœ ν˜•: (Bool, Char)
  • ('a','b','c')의 μœ ν˜•: (Char, Char, Char)
  • λ¦¬μŠ€νŠΈμ™€λŠ” 달리, νŠœν”Œμ˜ 길이 λ˜ν•œ μœ ν˜•μ„ 결정함.
In [7]:
:t 4 == 5
4 == 5 :: Bool
  • 4 == 5의 μœ ν˜•: Bool
  • 이유: 4 == 5λŠ” False 둜 κ³„μ‚°λ˜λŠ”λ°, Falseκ°€ Bool μœ ν˜•μ„ 가짐.

함수의 유형

ν•˜μŠ€μΌˆμ˜ ν‘œν˜„μ‹μ€ ν•¨μˆ˜λ₯Ό ν™œμš©ν•˜μ—¬ μƒμ„±ν•œλ‹€. λ”°λΌμ„œ ν•¨μˆ˜ λ˜ν•œ μœ ν˜•μ„ κ°–λŠ”λ‹€. ν•¨μˆ˜λ₯Ό μž‘μ„±ν•  λ•Œ, ν•¨μˆ˜μ˜ μœ ν˜•μ„ λͺ…μ‹œμ μœΌλ‘œ ν‘œκΈ°ν•  ν•„μš”λŠ” μ—†μ§€λ§Œ 맀우 κ°„λ‹¨ν•œ ν•¨μˆ˜ μ •μ˜λ₯Ό μž‘μ„±ν•  λ•Œλ₯Ό μ œμ™Έν•˜κ³ , μΌλ°˜μ μœΌλ‘œλŠ” μœ ν˜• 선언을 ν•΄μ£ΌλŠ” 것이 μ’‹λ‹€. λ”°λΌμ„œ μ§€κΈˆλΆ€ν„° μ„ μ–Έλ˜λŠ” λͺ¨λ“  ν•¨μˆ˜μ— μœ ν˜•μ„ λͺ…μ‹œν•  것이닀.

예제

2μž₯μ—μ„œ μ‘°κ±΄μ œμ‹œλ²•μ„ μ΄μš©ν•˜μ—¬ λ¬Έμžμ—΄μ—μ„œ λŒ€λ¬Έμžλ§Œ λ‚¨κΈ°λŠ” ν•¨μˆ˜ removeNonUppercaseλ₯Ό λ‹€μŒκ³Ό 같이 μ •μ˜ν•˜μ˜€λ‹€.

In [8]:
removeNonUppercase str = [ c | c <- str, c `elem` ['A'..'Z']]

이제 μœ„ ν•¨μˆ˜μ˜ μœ ν˜•μ„ ν™•μΈν•΄λ³΄μž.

In [9]:
:t removeNonUppercase
removeNonUppercase :: [Char] -> [Char]

removeNonUppercase ν•¨μˆ˜μ˜ μœ ν˜•μ€ [Char] -> [Char] 이며, ν•˜λ‚˜μ˜ λ¬Έμžμ—΄μ„ 인자둜 λ°›μ•„ λ‹€λ₯Έ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λΌλŠ” μ˜λ―Έμ΄λ‹€.

이렇듯 removeNonUppercase ν•¨μˆ˜μ™€ 같이 κ°„λ‹¨ν•œ ν•¨μˆ˜μ˜ μœ ν˜•μ€ ν•˜μŠ€μΌˆ μ»΄νŒŒμΌλŸ¬κ°€ 슀슀둜 μΆ”λ‘ ν•΄λ‚Ό 수 μžˆλ‹€. λ”°λΌμ„œ μ• μ΄ˆμ— μœ„ ν•¨μˆ˜λ₯Ό μ•„λž˜μ™€ 같이 μ •μ˜ν•  μˆ˜λ„ μžˆλ‹€.

In [10]:
removeNonUppercase :: [Char] -> [Char]
removeNonUppercase str = [ c | c <- str, c `elem` ['A'..'Z']]

[Char]와 String은 λ™μ˜μ–΄μ΄μ΄κΈ°μ— μ•„λž˜μ™€ 같이 μ •μ˜ν•˜λŠ” 게 보닀 직관적이닀.

In [11]:
removeNonUppercase :: String -> String
removeNonUppercase str = [ c | c <- str, c `elem` ['A'..'Z']]

예제

μ•„λž˜μ— μ •μ˜λœ addThree ν•¨μˆ˜λŠ” μ„Έ 개의 μ •μˆ˜λ₯Ό 인자둜 λ°›μ•„ μ„Έ μ •μˆ˜μ˜ 합을 κ³„μ‚°ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€. λ”°λΌμ„œ ν•¨μˆ˜μ˜ μœ ν˜•μ€ μ„Έ 개의 μ •μˆ˜ μœ ν˜•(Int)λ₯Ό μ‚¬μš©ν•˜κ³ , λ°˜ν™˜κ°’ λ˜ν•œ μ •μˆ˜ μœ ν˜•(Int) μž„μ„ μ•”μ‹œν•΄μ•Ό ν•œλ‹€.

In [12]:
addThree :: Int -> Int -> Int -> Int
addThree x y z = x + y + z

λ§€κ°œλ³€μˆ˜λ“€μ˜ μœ ν˜•μ€ ->둜 κ΅¬λΆ„ν•˜λ©°, λ°˜ν™˜κ°’μ˜ μœ ν˜•μ€ 맨 λ§ˆμ§€λ§‰μ— λͺ…μ‹œν•œλ‹€.

μ£Όμ˜μ‚¬ν•­

  • ν•¨μˆ˜μ˜ κΈ°λŠ₯상 μœ ν˜•μ„ μ•„λž˜μ™€ 같이 μž‘μ„±ν•  μˆ˜λ„ μžˆμ§€λ§Œ μ—„λ°€ν•˜κ²Œ λ§ν•˜λ©΄ λ‹€λ₯Έ μœ ν˜•μ΄λ‹€. μ΄μœ λŠ” μ°¨μ°¨ μ•Œκ²Œλ  것이닀.

    (Int, Int, Int) -> Int
    
  • μ•žμ„œ μ‚΄νŽ΄ λ³΄μ•˜λ“―μ΄ ν•¨μˆ˜λ₯Ό μ •μ˜ν•  λ•Œ μœ ν˜•μ„ μ •ν™•νžˆ λͺ¨λ₯΄κ² λ‹€λ©΄ λ¨Όμ € μœ ν˜• μ„ μ–Έ 없이 ν•¨μˆ˜λ₯Ό μž‘μ„±ν•œ λ‹€μŒμ— :t λͺ…령문을 μ΄μš©ν•˜μ—¬ ν•¨μˆ˜μ˜ μœ ν˜•μ„ 확인할 수 μžˆλ‹€.

하스켈의 기본 유형

Int 유형

1, 2, 3 λ“± μ •μˆ˜λ“€μ˜ μœ ν˜•μ΄λ©°, μ΅œμ†Ÿκ°’κ³Ό μ΅œλŒ“κ°’μœΌλ‘œ μ œν•œλœ ꡬ간에 ν¬ν•¨λœ μ •μˆ˜λ“€μ„ λŒ€μƒμœΌλ‘œ ν•œλ‹€.

In [13]:
addThree 3 5 7
15

μ£Όμ˜μ‚¬ν•­: 이렇듯 μ œν•œλœ κ΅¬κ°„μ˜ 값을 κ°–λŠ” μœ ν˜•μ˜ μ΅œμ†Ÿκ°’κ³Ό μ΅œλŒ“κ°’μ€ minBound 와 maxBound ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ 확인할 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, Int ν˜•μ˜ 경우 μ΅œμ†Ÿκ°’κ³Ό μ΅œλŒ“κ°’μ€ λ‹€μŒκ³Ό 같이 ν™•μΈν•œλ‹€.

In [14]:
(minBound::Int)
-9223372036854775808
In [15]:
(maxBound::Int)
9223372036854775807

Integer 유형

λ˜λ‹€λ₯Έ μ •μˆ˜λ“€μ˜ μœ ν˜•μ΄λ‹€. ν•˜μ§€λ§Œ Int와 달리 Integer에 μ†ν•œ μ •μˆ˜λŠ” μ œν•œλ˜μ§€ μ•ŠλŠ”λ‹€. 즉, μ—„μ²­ 큰 숫자λ₯Ό 닀뀄야 ν•˜λŠ” 경우 μ‚¬μš©ν•œλ‹€. 예λ₯Ό λ“€μ–΄, μ•„λž˜ factorial ν•¨μˆ˜λŠ” κ³„μŠΉκ³Ό 같이 맀우 큰 수λ₯Ό κ³„μ‚°ν•˜κΈ°μ— Integer μœ ν˜•μ„ μ‚¬μš©ν•œλ‹€.

In [16]:
factorial :: Integer -> Integer
factorial n = product [1..n]
In [17]:
factorial 50
30414093201713378043612608166064768844377641568960512000000000000

μ£Όμ˜μ‚¬ν•­: Int μœ ν˜•μ— μ†ν•œ μ •μˆ˜λ₯Ό λ‹€λ£¨λŠ” 일이 보닀 λΉ λ₯΄κ³  νš¨μœ¨μ μ΄κΈ°μ—, κ·Έλ ‡κ²Œ 큰 μ •μˆ˜λ₯Ό λ‹€λ£° ν•„μš”κ°€ μ—†λ‹€λ©΄ Int μœ ν˜•μ΄ ꢌμž₯λœλ‹€.

Float 유형

단 정밀도(single precision)λ₯Ό κ°–λŠ” λΆ€λ™μ†Œμˆ˜μ λ“€μ˜ μœ ν˜•μ΄λ‹€.

μ•„μ•  ν•¨μˆ˜λŠ” λ°˜μ§€λ¦„μ΄ μ£Όμ–΄μ‘Œμ„ λ•Œ μ›μ˜ λ‘˜λ ˆλ₯Ό κ³„μ‚°ν•œλ‹€.

In [18]:
circumference :: Float -> Float
circumference r = 2 * pi * r
In [19]:
circumference 4.0
25.132742

μ°Έκ³ 

  • λΆ€λ™μ†Œμˆ˜μ : μ‹€μˆ˜λ₯Ό μ»΄ν“¨ν„°μ—μ„œ κ΅¬ν˜„ν•˜λŠ” 일반적인 방식을 λ”°λ₯Έ 수. μ‹€μ œλ‘œλŠ” μ†Œμˆ«μ  μ΄ν•˜κ°€ μ œν•œλœ μœ λ¦¬μˆ˜μž„.
  • 단 정밀도(single precision): ν•˜λ‚˜μ˜ λΆ€λ™μ†Œμˆ˜μ μ„ 계산할 λ•Œ μ‚¬μš©λ˜λŠ” λ©”λͺ¨λ¦¬κ°€ 32λΉ„νŠΈλ‘œ μ œν•œλ¨.
  • λ°° 정밀도(double precision): ν•˜λ‚˜μ˜ λΆ€λ™μ†Œμˆ˜μ μ„ 계산할 λ•Œ μ‚¬μš©λ˜λŠ” λ©”λͺ¨λ¦¬κ°€ 64λΉ„νŠΈκΉŒμ§€ ν™•μž₯됨.
  • 이외에 λΆ€λ™μ†Œμˆ˜μ μ„ 계산할 λ•Œ μ‚¬μš©ν•˜λŠ” λ©”λͺ¨λ¦¬μ˜ ν•œκ³„μ— 따라 λ‹€μ–‘ν•œ 정밀도가 제곡됨.

Double 유형

두 배의 정밀도λ₯Ό 가진 λΆ€λ™μ†Œμˆ˜μ λ“€μ˜ μœ ν˜•μ΄λ‹€. μ•„λž˜ 예제λ₯Ό 톡해 단 정밀도λ₯Ό μ‚¬μš©ν•  λ•Œμ™€ λ°° 정밀도λ₯Ό μ‚¬μš©ν•  λ•Œμ˜ 차이λ₯Ό 확인할 수 μžˆλ‹€.

In [20]:
circumference' :: Double -> Double
circumference' r = 2 * pi * r
In [21]:
circumference' 4.0
25.132741228718345

Bool 유형

진리값을 ν¬ν•¨ν•˜λŠ” λΆ€μšΈ μœ ν˜•μ΄λ©°, True 와 False 였직 두 개의 κ°’κ³Ό λ™μΉ˜μΈ ν‘œν˜„μ‹λ§Œ λΆ€μšΈ μœ ν˜•μ— μ†ν•œλ‹€.

In [22]:
:t True
True :: Bool

(1 == 2) λŠ” False 와 λ™μΉ˜μΈ ν‘œν˜„μ‹μ΄λ‹€.

In [23]:
:t (1 == 2)
(1 == 2) :: Bool

Char 유형

λ¬Έμžλ“€μ˜ μœ ν˜•μ΄λ©°, ν‚€λ³΄λ“œ μƒμ—μ„œ λ³΄μ΄λŠ” 문자 뿐만 μ•„λ‹ˆλΌ μœ λ‹ˆμ½”λ“œ(Unicode)에 ν¬ν•¨λœ λͺ¨λ“  λ¬Έμžκ°€ 이 μœ ν˜•μ„ κ°–λŠ”λ‹€. λ¬ΈμžλŠ” μž‘μ€ λ”°μ˜΄ν‘œ(')둜 감싸져야 ν•œλ‹€.

In [24]:
:t 'A'
'A' :: Char

μ£Όμ˜μ‚¬ν•­

  • ν•˜λ‚˜μ˜ 문자라 ν•˜λ”λΌλ„ 큰 λ”°μ˜΄ν‘œ(")둜 감싸이면 λ¬Έμžμ—΄, 즉 문자 리슀트둜 μΈμ‹λœλ‹€.
In [25]:
:t "A"
"A" :: [Char]

유형 변수(Type variables)

μ•žμ„œ μ‚΄νŽ΄λ³Έ κΈ°λ³Έ μœ ν˜•λ“€μ€ μ‚¬μš©λ˜λŠ” 값듀에 μ˜μ‘΄ν•˜μ§€ μ•ŠλŠ”λ‹€. λ°˜λ©΄μ— 리슀트 μœ ν˜•κ³Ό νŠœν”Œ μœ ν˜•μ€ ν•­λͺ©μ˜ μœ ν˜•μ— 따라 μœ ν˜•μ΄ 달라진닀. 즉, λ¬΄ν•œνžˆ λ§Žμ€ 리슀트 μœ ν˜•κ³Ό νŠœν”Œ μœ ν˜•μ΄ μ‘΄μž¬ν•œλ‹€.

In [26]:
:t ['a','b','c']
['a','b','c'] :: [Char]
In [27]:
:t [True, False, 1 == 2, True || 2 == 2]
[True, False, 1 == 2, True || 2 == 2] :: [Bool]
In [28]:
:t ('a', 'b', True)
('a', 'b', True) :: (Char, Char, Bool)
In [29]:
:t ('a', 'b')
('a', 'b') :: (Char, Char)

이와 같이 무수히 λ§Žμ€ μœ ν˜•μ„ κ³ μ •λœ ν˜•μ‹μœΌλ‘œ ν‘œν˜„ν•˜κΈ° μœ„ν•΄ μœ ν˜• λ³€μˆ˜(type variable) λ₯Ό ν™œμš©ν•œλ‹€.

예λ₯Ό λ“€μ–΄, μž„μ˜μ˜ λ¦¬μŠ€νŠΈμ™€ ν•¨κ»˜ ν˜ΈμΆœν•˜λ©΄ head λŠ” 주어진 리슀트의 머리(head)λ₯Ό λ°˜ν™˜ν•œλ‹€. λ”°λΌμ„œ μž„μ˜μ˜ μœ ν˜•μ˜ 리슀트λ₯Ό λ‹€λ£° 수 μžˆμ–΄μ•Ό ν•œλ‹€. head ν•¨μˆ˜μ˜ μœ ν˜•μ€ λ‹€μŒκ³Ό κ°™λ‹€.

In [30]:
:t head
head :: forall a. [a] -> a

head의 μœ ν˜•μ„ μ½λŠ” 방식은 λ‹€μŒκ³Ό κ°™λ‹€.

μž„μ˜μ˜ μœ ν˜• a에 λŒ€ν•΄, μœ ν˜• a의 κ°’μœΌλ‘œ 이루어진 λ¦¬μŠ€νŠΈκ°€ 인자둜 λ“€μ–΄μ˜€λ©΄ a μœ ν˜•μ˜ 값을 λ°˜ν™˜ν•œλ‹€.

예λ₯Ό λ“€μ–΄, μ •μˆ˜ λ¦¬μŠ€νŠΈκ°€ 인자둜 λ“€μ–΄μ˜€λ©΄ μ •μˆ˜λ₯Ό λ°˜ν™˜ν•˜κ³ , λ¬Έμžμ—΄μ΄ λ“€μ–΄μ˜€λ©΄ λ¬Έμžκ°€ λ°˜ν™˜λœλ‹€. 이렇듯 aλŠ” μž„μ˜μ˜ μœ ν˜•μ„ λŒ€λ³€ν•˜λŠ” 역할을 μˆ˜ν–‰ν•˜λŠ” μœ ν˜• λ³€μˆ˜μ΄λ‹€.

μ£Όμ˜μ‚¬ν•­

  • μœ ν˜• λ³€μˆ˜λŠ” λ³€μˆ˜μ΄μ§€ κ·Έ 자체둜 μœ ν˜•μ€ μ•„λ‹ˆλ‹€.
  • μœ ν˜• λ³€μˆ˜μ˜ 이름은 ν•œ κΈ€μž 이상일 수 μžˆμ§€λ§Œ, 보톡 a, b, c, d λ“±μœΌλ‘œ 이름을 뢙인닀.

길이가 2인 νŠœν”Œμ—μ„œ 첫 번째 ν•­λͺ©μ„ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜ fst의 μœ ν˜•λ„ λΉ„μŠ·ν•œ λͺ¨μ–‘을 κ°–λŠ”λ‹€.

In [31]:
:t fst
fst :: forall a b. (a, b) -> a

fst의 μœ ν˜•μ„ μ½λŠ” 방식은 λ‹€μŒκ³Ό κ°™λ‹€.

μž„μ˜μ˜ μœ ν˜• a와 b에 λŒ€ν•΄, a μœ ν˜•μ˜ κ°’κ³Ό b μœ ν˜•μ˜ κ°’μœΌλ‘œ 이루어진 길이가 2인 νŠœν”Œ 인자둜 λ“€μ–΄μ˜€λ©΄ a μœ ν˜•μ˜ 값을 λ°˜ν™˜ν•œλ‹€.

μ£Όμ˜μ‚¬ν•­

  • a와 b 두 μœ ν˜• λ³€μˆ˜ 이름이 λ‹€λ₯Έ μ΄μœ λŠ” 각 λ³€μˆ˜ λŒ€μ‹ μ— μ„œλ‘œ λ‹€λ₯Έ μœ ν˜•μ„ λŒ€μž…ν•΄μ„œ μ‚¬μš©ν•  수 μžˆλ‹€λŠ” μ˜λ―Έμ΄λ‹€. ν•˜μ§€λ§Œ, 두 λ³€μˆ˜ λͺ¨λ‘ λ™μΌν•œ μœ ν˜•μ„ κ°€λ¦¬μΌœλ„ λœλ‹€.
  • 일반적으둜 μ—¬λŸ¬ 개의 μ„œλ‘œ λ‹€λ₯Έ μœ ν˜• λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 있으며, μ΄λŠ” 각 λ³€μˆ˜μ— λŒ€ν•΄ μ„œλ‘œ λ‹€λ₯Έ μœ ν˜•μ„ μ‚¬μš©ν•  수 μžˆλ‹€λŠ” μ˜λ―Έμ΄μ§€ λ°˜λ“œμ‹œ 달라야 ν•œλ‹€λŠ” μ˜λ―ΈλŠ” μ•„λ‹ˆλ‹€.

fst ν•¨μˆ˜μ™€ 짝을 μ΄λ£¨λŠ” snd ν•¨μˆ˜μ˜ μœ ν˜•μ€ λ‹€μŒκ³Ό 같이 λ°˜ν™˜κ°’μ˜ μžλ£Œν˜•μ΄ b둜 ν‘œμ‹œλœλ‹€.

In [32]:
:t snd
snd :: forall a b. (a, b) -> b

snd의 μœ ν˜•μ„ μ½λŠ” 방식은 λ‹€μŒκ³Ό κ°™λ‹€.

μž„μ˜μ˜ μœ ν˜• a와 b에 λŒ€ν•΄, a μœ ν˜•μ˜ κ°’κ³Ό b μœ ν˜•μ˜ κ°’μœΌλ‘œ 이루어진 길이가 2인 νŠœν”Œ 인자둜 λ“€μ–΄μ˜€λ©΄ b μœ ν˜•μ˜ 값을 λ°˜ν™˜ν•œλ‹€.

다형 함수

head, fst, snd 이외에 tail, last, init λ“± λ¦¬μŠ€νŠΈμ™€ νŠœν”Œ κ΄€λ ¨ λ§Žμ€ ν•¨μˆ˜λ“€μ΄ λͺ¨λ‘ μ•„λž˜ λͺ¨μ–‘μ˜ μœ ν˜•μ„ κ°–λŠ”λ‹€.

forall a b c. ...

μœ„ λͺ¨μ–‘μ˜ μœ ν˜•μ„ κ°–λŠ” ν•¨μˆ˜λ₯Ό λ‹€ν˜• ν•¨μˆ˜(polymorphic functions), μœ„μ™€ 같이 λ‹€ν˜•ν•¨μˆ˜λ₯Ό μ§€μ›ν•˜λŠ” κΈ°λŠ₯을 λ‹€ν˜•μ„±(polymorphism) 이라 λΆ€λ₯Έλ‹€. μ•žμ„œ μ‚΄νŽ΄λ³΄μ•˜λ“―μ΄ λ‹€ν˜•μ„±μ„ ν™œμš©ν•˜μ—¬ μ—¬λŸ¬ μœ ν˜•μ— λŒ€ν•΄ μž‘λ™ν•˜λŠ” 보닀 μΌλ°˜ν™”λœ ν•¨μˆ˜λ₯Ό μ •μ˜ν•  수 μžˆλ‹€.

μ£Όμ˜μ‚¬ν•­: C++, μžλ°”, 파이썬 λ“±μ˜ μ–Έμ–΄μ—μ„œ μ§€μ›ν•˜λŠ” μ œλ„€λ¦­(generic) 클래슀 κ°œλ…μ΄ λ°”λ‘œ 이 λ‹€ν˜•μ„±μ„ μ‘μš©ν•œ 것이닀.

3.2 유형클래스(Typeclasses)

μœ ν˜•ν΄λž˜μŠ€(typeclass) λŠ” μœ ν˜•μ΄ κ°€μ Έμ•Ό ν•˜λŠ” μ„±μ§ˆκ³Ό κΈ°λŠ₯을 λ¬˜μ‚¬ν•˜λŠ” μΌμ’…μ˜ μΈν„°νŽ˜μ΄μŠ€(interface) 이닀. νŠΉμ • μœ ν˜•μ΄ μ–΄λ–€ μœ ν˜•ν΄λž˜μŠ€κ°€ λ¬˜μ‚¬ν•˜λŠ” μ„±μ§ˆκ³Ό κΈ°λŠ₯을 λͺ¨λ‘ κ°€μ§ˆ λ•Œ, ν•΄λ‹Ή μœ ν˜•μ΄ κ·Έ μœ ν˜•ν΄λž˜μŠ€μ— μ†ν•œλ‹€ 라고 λ§ν•œλ‹€.

μ°Έκ³ 

  • 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ–Έμ–΄(OOP)의 클래슀 κ°œλ…κ³Ό μœ μ‚¬ν•˜μ§€λ§Œ μ‚¬μš©λ²•μ΄ 많이 λ‹€λ₯΄λ‹€.
  • μžλ°”μ˜ μΈν„°νŽ˜μ΄μŠ€μ™€ κ°€μž₯ λΉ„μŠ·ν•˜κ²Œ μž‘λ™ν•œλ‹€.
    • μžλ°”: μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ¨Όμ € μ •μ˜ν•œ 후에 ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ”(implements) 클래슀λ₯Ό μ •μ˜ν•¨.
    • ν•˜μŠ€μΌˆ: μœ ν˜•κ³Ό μœ ν˜•ν΄λž˜μŠ€λ₯Ό μƒν˜Έ λ…λ¦½μ μœΌλ‘œ μ •μ˜ν•œ 후에, μœ ν˜•μ΄ νŠΉμ • μœ ν˜•ν΄λž˜μŠ€κ°€ μ œκ³΅ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•  수 μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό 검사함.

μœ ν˜•ν΄λž˜μŠ€λ₯Ό μ΄ν•΄ν•˜κΈ° μœ„ν•΄ λ™μΉ˜μ„±(equality)을 κ²€μ‚¬ν•˜λŠ” ν•¨μˆ˜ == 의 μœ ν˜•μ„ μ΄μš©ν•΄λ³΄μž.

μ°Έκ³ : ==, +, *, -, /, λ“± 일반 μ•ŒνŒŒλ²³μ΄ μ•„λ‹ˆλΌ νŠΉμˆ˜ν•œ 문자둜만 κ΅¬μ„±λœ ν•¨μˆ˜λ“€μ€ μ€‘μœ„ ν•¨μˆ˜μ΄λ‹€. ν•˜μ§€λ§Œ μœ ν˜•μ„ ν™•μΈν•˜κΈ° μœ„ν•΄μ„œλŠ” μ „μœ„ ν•¨μˆ˜ ν˜•νƒœλ‘œ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”λ° 이λ₯Ό μœ„ν•΄ μ€‘μœ„ ν•¨μˆ˜λ₯Ό μ†Œκ΄„ν˜Έλ‘œ 감싸면 λœλ‹€.

In [33]:
:t (==)
(==) :: forall a. Eq a => a -> a -> Bool

head, fst λ“±κ³ΌλŠ” λ‹€λ₯΄κ²Œ, 'Eq a =>' 뢀뢄이 μΆ”κ°€λ˜μ—ˆλ‹€. 기호 => μ™ΌνŽΈμ— λͺ…μ‹œλœ 뢀뢄은 ν•΄λ‹Ή ν•¨μˆ˜μ˜ μΈμžλ“€μ΄ λ§Œμ‘±μ‹œμΌœμ•Ό ν•˜λŠ” 클래슀 μ œμ•½(class constraint) 을 λ‚˜νƒ€λ‚Έλ‹€.

예λ₯Ό λ“€μ–΄, λ™μΉ˜μ„± 검사 ν•¨μˆ˜ (==)에 μ‚¬μš©λ˜λŠ” 두 인자 λͺ¨λ‘ Eq μœ ν˜•ν΄λž˜μŠ€μ— μ†ν•˜λŠ” μœ ν˜• a의 값이어야 함을 μœ„ μœ ν˜•μœΌλ‘œλΆ€ν„° μ•Œ 수 μžˆλ‹€. μ‹€μ œλ‘œ (==)의 μœ ν˜•μ˜ μ˜λ―ΈλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

Eq ν΄λž˜μŠ€μ— μ†ν•˜λŠ” μž„μ˜μ˜ μœ ν˜• a에 λŒ€ν•΄, a μœ ν˜•μ˜ κ°’ 두 개λ₯Ό 인자둜 λ°›μœΌλ©΄ λΆ€μšΈκ°’μ„ λ°˜ν™˜ν•œλ‹€.

즉, "Eq ν΄λž˜μŠ€μ— ν¬ν•¨λ˜λŠ” μœ ν˜•" μ΄λΌλŠ” 쑰건이 ν—ˆμš©λ˜λŠ” μœ ν˜•μ„ μ œμ•½ν•œλ‹€. μ‹€μ œλ‘œ 두 κ°’μ˜ λ™μΉ˜μ„±μ„ κ²€μ‚¬ν•˜λ €λ©΄ μš°μ„ μ μœΌλ‘œ 두 값이 λ™μΌν•œ 값을 λ‚˜νƒ€λ‚΄λŠ”μ§€ μ—¬λΆ€λ₯Ό 검사할 수 μžˆμ–΄μ•Ό ν•œλ‹€. 예λ₯Ό λ“€μ–΄, 두 μ •μˆ˜μ˜ λ™μΉ˜μ„±, 두 문자의 λ™μΉ˜μ„±, 두 μ§„λ¦¬κ°’μ˜ λ™μΉ˜μ„±μ€ 검사가 κ°€λŠ₯ν•˜λ‹€. λ°˜λ©΄μ— 두 ν•¨μˆ˜μ˜ λ™μΉ˜μ„±μ€ 검사가 λΆˆκ°€λŠ₯ν•œλ°, μ΄λŠ” 튜링의 μ •μ§€λ¬Έμ œ(Turing's Halting Problem)λ₯Ό μ΄μš©ν•˜μ—¬ 증λͺ…ν•  수 μžˆλ‹€λŠ” 사싀 μ •λ„λ§Œ κΈ°μ–΅ν•΄ 두기 λ°”λž€λ‹€.

μ°Έκ³ : λ‚˜μ€‘μ— μ†Œκ°œν•  IO λΌλŠ” μž…μΆœλ ₯ 처리 μœ ν˜•κ³Ό ν•¨μˆ˜μ˜ μœ ν˜•μ„ μ œμ™Έν•œ λͺ¨λ“  ν‘œμ€€ ν•˜μŠ€μΌˆ μœ ν˜•μ€ Eq μœ ν˜•ν΄λž˜μŠ€μ— ν¬ν•¨λœλ‹€.

클래슀 μ œμ•½ 'Eq a'λ₯Ό μ‚¬μš©ν•˜λŠ” 또 λ‹€λ₯Έ ν•¨μˆ˜λŠ” 예λ₯Ό λ“€μ–΄ 리슀트의 νŠΉμ • κ°’ 포함여뢀λ₯Ό κ²€μ‚¬ν•˜λŠ” elem ν•¨μˆ˜μ΄λ‹€.

In [34]:
:t elem
elem :: forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool

그런데 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 μœ ν˜•ν΄λž˜μŠ€μ— μ†ν•œλ‹€.

In [35]:
5 == 5
True
In [36]:
5 /= 5
False
In [37]:
'a' == 'a'
True
In [38]:
"Ho Ho" == "Ho Ho"
True
In [39]:
3.432 == 3.432
True

Ord 유형클래스

Ord μœ ν˜•ν΄λž˜μŠ€μ— μ†ν•˜λŠ” μœ ν˜•μ˜ 값듀은 μ„œλ‘œ 크기 비ꡐλ₯Ό ν•  수 μžˆλ‹€. ν•¨μˆ˜μ˜ μœ ν˜•μ„ μ œμ™Έν•œ μ§€κΈˆκΉŒμ§€ 닀룬 λͺ¨λ“  μœ ν˜•μ€ Ord μœ ν˜•ν΄λž˜μŠ€μ— μ†ν•œλ‹€.

Ord λŠ” 일반적으둜 μ‚¬μš©λ˜λŠ” λͺ¨λ“  비ꡐ ν•¨μˆ˜λ₯Ό μΈν„°νŽ˜μ΄μŠ€λ‘œ μ œκ³΅ν•œλ‹€.

  • >, <, >=, <=

  • compare: Ord μœ ν˜•ν΄λž˜μŠ€μ— μ†ν•œ μœ ν˜•μ˜ 두 값을 λΉ„κ΅ν•˜μ—¬ Ordering μœ ν˜•μ˜ 값을 λ°˜ν™˜ν•¨.

    • Ordering: μ•„λž˜ μ„Έ 개의 κ°’μœΌλ‘œ κ΅¬μ„±λœ μœ ν˜•
      • GT (greater than, 크닀)
      • LT (less than, μž‘λ‹€)
      • EQ (equal, κ°™λ‹€)
  • min, max

예λ₯Ό λ“€μ–΄, < ν•¨μˆ˜μ˜ μœ ν˜•μ€ λ‹€μŒκ³Ό κ°™λ‹€.

In [40]:
:t (>)
(>) :: forall a. Ord a => a -> a -> Bool

μœ„ μœ ν˜•μ€ > ν•¨μˆ˜λŠ” Ord μœ ν˜•ν΄λž˜μŠ€μ— μ†ν•œ μœ ν˜•μ— λŒ€ν•΄μ„œλ§Œ μž‘λ™ν•œλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€. 이것을 λ‹€λ₯΄κ²Œ ν‘œν˜„ν•˜λ©΄, νŠΉμ • μœ ν˜• aκ°€ Ord μœ ν˜•ν΄λž˜μŠ€μ— ν¬ν•¨λ˜λ €λ©΄ μ•„λž˜ μœ ν˜•μ„ κ°–λŠ” ν•¨μˆ˜λ₯Ό μ •μ˜ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€λŠ” 것을 λ‚˜νƒ€λ‚Έλ‹€.

a -> a -> Bool

μœ ν˜•ν΄λž˜μŠ€μ— ν¬ν•¨λœ ν•¨μˆ˜μ˜ μœ ν˜•μ΄ ν•΄λ‹Ή μœ ν˜•ν΄λž˜μŠ€λ₯Ό 클래슀 μ œμ•½μœΌλ‘œ κ°–λŠ” κ²ƒμ˜ μžμ„Έν•œ μ˜λ―ΈλŠ” 이후에 보닀 μžμ„Ένžˆ μ„€λͺ…ν•œλ‹€.

<=, >=, compare ν•¨μˆ˜λ₯Ό 톡해 μ•Œ 수 μžˆλ“―μ΄ Ord의 멀버가 되기 μœ„ν•΄μ„œλŠ” λ¨Όμ € Eq에 ν¬ν•¨λ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€. compare ν•¨μˆ˜λŠ” 크기 비ꡐ가 κ°€λŠ₯ν•œ 두 값을 인자둜 λ°›μœΌλ©΄ 첫째 μΈμžκ°€ λ‘˜μ§Έ μΈμžλ³΄λ‹€ 큰지(GT), μž‘μ€μ§€(LT), μ•„λ‹ˆλ©΄ 같은지(EQ)λ₯Ό κ²€μ‚¬ν•˜μ—¬ νŒλ‹¨ν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€.

In [41]:
"Abrakadabra" < "Zebra"
True
In [42]:
5 >= 2
True
In [43]:
"Abrakadabra" `compare` "Zebra"
LT
In [44]:
compare 5 3
GT
In [45]:
compare (2, 3) (1+1, 5-2)
EQ

Show 유형클래스

Show μœ ν˜•ν΄λž˜μŠ€μ— μ†ν•˜λŠ” μœ ν˜•μ˜ 값은 (터미널) 화면에 λ¬Έμžμ—΄λ‘œ ν‘œμ‹œν•  수 있으며, ν•¨μˆ˜λ₯Ό μ œμ™Έν•œ λͺ¨λ“  μœ ν˜•μ€ Show에 ν¬ν•¨λœλ‹€. Show μœ ν˜•ν΄λž˜μŠ€κ°€ μ œκ³΅ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€μ— μ†ν•˜λŠ” ν•¨μˆ˜λŠ” show이며, Show 에 μ†ν•˜λŠ” μœ ν˜•μ˜ 값을 λ¬Έμžμ—΄λ‘œ λ³€ν™˜μ‹œν‚¨λ‹€.

In [46]:
show 3
"3"
In [47]:
show 5.334
"5.334"
In [48]:
show True
"True"

μ°Έκ³ : show ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•œλ‹€λŠ” 것은 파이썬 클래슀의 __str__() λ˜λŠ” __repr()__ λ©”μ„œλ“œμ™€ μœ μ‚¬ν•œ κΈ°λŠ₯을 μˆ˜ν–‰ν•œλ‹€. μžλ°” 클래슀의 toString() λ©”μ„œλ“œμ˜ κΈ°λŠ₯도 크게 λ‹€λ₯΄μ§€ μ•Šλ‹€.

Read 유형클래스

Show에 λŒ€μ‘λ˜λŠ” 클래슀이며, read ν•¨μˆ˜λ₯Ό μΈν„°νŽ˜μ΄μŠ€λ‘œ μ œκ³΅ν•œλ‹€. μ§€κΈˆκΉŒμ§€ 닀뀄진 λͺ¨λ“  μœ ν˜•μ€ Show μœ ν˜•ν΄λž˜μŠ€μ— μ†ν•œλ‹€. read ν•¨μˆ˜λŠ” λ¬Έμžμ—΄μ„ Read ν΄λž˜μŠ€μ— μ†ν•˜λŠ” μ μ ˆν•œ μœ ν˜•μ˜ κ°’μœΌλ‘œ λ³€ν™˜μ‹œμΌœμ•Ό ν•œλ‹€.

  • read "True"λŠ” λΆ€μšΈ μžλ£Œν˜•μ˜ True둜 κ³„μ‚°λœλ‹€.
In [49]:
read "True" || False
True
  • read "8.2"λŠ”, 예λ₯Ό λ“€μ–΄, Float μœ ν˜•μ˜ 8.2둜 κ³„μ‚°λœλ‹€.
    • Float, Double λ“± μ—¬λŸ¬ μ’…λ₯˜μ˜ λΆ€λ™μ†Œμˆ˜μ  μœ ν˜•μ΄ μ‘΄μž¬ν•˜κΈ°μ— '예λ₯Ό λ“€μ–΄' ν‘œν˜„μ„ μ‚¬μš©ν•˜μ˜€μŒμ— μ£Όμ˜ν•˜λΌ.
In [50]:
read "8.2" + 3.8
12.0
  • read "5"λŠ”, 예λ₯Ό λ“€μ–΄, Int μœ ν˜•μ˜ 5둜 κ³„μ‚°λœλ‹€.
    • Int, Integer λ“± μ—¬λŸ¬ μ’…λ₯˜μ˜ μ •μˆ˜ μœ ν˜•μ΄ μ‘΄μž¬ν•˜κΈ°μ— '예λ₯Ό λ“€μ–΄' ν‘œν˜„μ„ μ‚¬μš©ν•˜μ˜€μŒμ— μ£Όμ˜ν•˜λΌ.
In [51]:
read "5" - 2
3
  • read "[1,2,3,4]"λŠ”, 예λ₯Ό λ“€μ–΄, [Int] μœ ν˜•μ˜ [1,2,3,4]둜 κ³„μ‚°λœλ‹€.
In [52]:
read "[1,2,3,4]" ++ [3]
[1,2,3,4,3]

주의!

read "True" λ˜λŠ” read "5"λ₯Ό μ‹€ν–‰ν•˜λ©΄ 였λ₯˜κ°€ λ°œμƒν•œλ‹€.

In [53]:
read "True"
Prelude.read: no parse
In [54]:
read "5"
Prelude.read: no parse

no parse ν‘œν˜„μ€ GHCκ°€ λ¬Έμžμ—΄ "5"λ₯Ό μ–΄λŠ μœ ν˜•μ˜ κ°’μœΌλ‘œ νŒŒμ‹±(λ¬Έμž₯뢄석, parsing)해야할지 λͺ…ν™•ν•˜μ§€ μ•Šλ‹€λŠ” μ˜λ―Έμ΄λ‹€. λ°˜λ©΄μ—, 예λ₯Ό λ“€μ–΄, read "5" - 2의 κ²½μš°λŠ” - 2κ°€ ν•¨κ»˜ μ‚¬μš©λ˜κΈ°μ— λΊ„μ…ˆμ„ μ§€μ›ν•˜λŠ” μ •μˆ˜ λ˜λŠ” λΆ€λ™μ†Œμˆ˜μ  μœ ν˜•μœΌλ‘œ νŒλ‹¨ν•˜λŠ” 것이 κ°€λŠ₯ν–ˆλ‹€.

λ¬Όλ‘  μ •ν™•νžˆ μ–΄λ–€ μœ ν˜•μΈμ§€ ν•˜λ‚˜λ₯Ό μ •ν•  μˆ˜λŠ” μ—†λ‹€. ν•˜μ§€λ§Œ λΊ„μ…ˆμ„ μ§€μ •ν•˜λŠ” μœ ν˜•μ€ λͺ¨λ‘ Num μ΄λΌλŠ” μœ ν˜•ν΄λž˜μŠ€μ— μ†ν•œλ‹€. λ”°λΌμ„œ μ•„λž˜μ˜ κ²°κ³Όλ₯Ό μ–»κ²Œ λœλ‹€.

In [55]:
:t (read "5" - 2)
(read "5" - 2) :: forall a. (Num a, Read a) => a

즉, (read "5" - 2)λŠ” λ‹€ν˜• μœ ν˜•μ„ 가지며, ν•΄λ‹Ή λ‹€ν˜• μœ ν˜•μ˜ μ˜λ―ΈλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

Num μœ ν˜•ν΄λž˜μŠ€μ™€ Read μœ ν˜•ν΄λž˜μŠ€ λͺ¨λ‘μ— μ†ν•˜λŠ” μž„μ˜μ˜ μœ ν˜• aλŠ” (read "5" - 2)λ₯Ό κ°’μœΌλ‘œ κ°–λŠ”λ‹€.

read ν•¨μˆ˜ λ‹¨λ…μœΌλ‘œ λ°˜ν™˜κ°’μ˜ μœ ν˜•μ„ μΆ”λ‘ ν•  수 μ—†λŠ” μ΄μœ λŠ” μœ ν˜•μœΌλ‘œλ„ 확인할 수 μžˆλ‹€.

In [56]:
:t read
read :: forall a. Read a => String -> a

즉, read ν•¨μˆ˜κ°€ μœ ν˜• λ³€μˆ˜ a 에 μ–΄λ–€ μœ ν˜•μ„ λŒ€μž…ν• μ§€ read ν•¨μˆ˜ μžμ²΄λ§ŒμœΌλ‘œλŠ” μ•Œ 수 μ—†λ‹€. ν•˜μ§€λ§Œ μœ ν˜•μ„ 일λͺ… μœ ν˜• 주석(type annotations) ν˜•νƒœλ‘œ λͺ…μ‹œν•˜λ©΄ μœ ν˜• 좔둠이 κ°€λŠ₯해진닀.

μœ ν˜• 주석을 μΆ”κ°€ν•˜λŠ” 방식은 μ•„λž˜μ™€ κ°™λ‹€.

In [57]:
read "5" :: Int
5
In [58]:
read "5" :: Float
5.0
In [59]:
(read "5" :: Float) * 4
20.0
In [60]:
read "[1,2,3,4]" :: [Int]
[1,2,3,4]
In [61]:
read "(3, 'a')" :: (Int, Char)
(3,'a')

μ°Έκ³ : ν‘œν˜„μ‹ μœ ν˜•μ€ λŒ€λΆ€λΆ„ ν•˜μŠ€μΌˆ 컴파일러 슀슀둜 μΆ”λ‘ ν•  수 μžˆλ‹€κ³  이전에 μ–ΈκΈ‰ν•˜μ˜€λ‹€. ν•˜μ§€λ§Œ Read "5" 와 같은 ν‘œν˜„μ‹μ˜ 경우처럼 μœ ν˜•μ„ κ²°μ •ν•  수 μ—†λŠ” κ²½μš°κ°€ λ°œμƒν•˜λ©°, 그런 κ²½μš°μ—λŠ” 였λ₯˜ λ°œμƒμ„ λŒ€λΉ„ν•΄ μœ ν˜• 주석을 ν™œμš©ν•΄μ•Ό ν•œλ‹€.

Enum 유형클래스

Enum μœ ν˜•ν΄λž˜μŠ€μ— μ†ν•˜λŠ” μœ ν˜•μ˜ 값듀은 크기 μˆœμ„œλŒ€λ‘œ μ—΄κ±°(enumeration)될 수 μžˆμ–΄μ•Ό ν•œλ‹€. 값을 μ—΄κ±°ν•  수 μžˆλ‹€μ˜ μ˜λ―ΈλŠ” ν•˜λ‚˜μ˜ 값이 μ£Όμ–΄μ‘Œμ„ λ•Œ κ·Έ κ°’μ˜ 이전값(predecessor)κ³Ό λ‹€μŒκ°’(successor)을 지정할 수 μžˆλ‹€λŠ” μ˜λ―Έμ΄λ‹€.

λ‹€μŒκ°’κ³Ό 이전값은 각각 succ ν•¨μˆ˜μ™€ pred ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄ 얻을 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, μ–‘μ˜ μ •μˆ˜ 1의 이전값은 0이고, λ‹€μŒκ°’μ€ 2이며, 문자 c의 이전값은 b, λ‹€μŒκ°’μ€ d이닀. λ°˜λ©΄μ— λ¬Έμžμ—΄ "cde"의 이전값과 λ‹€μŒκ°’μ€ μ•Œ 수 μ—†λ‹€. 즉, λ¬Έμžμ—΄ μœ ν˜• String은 Enum μœ ν˜•ν΄λž˜μŠ€μ— ν¬ν•¨λ˜μ§€ μ•ŠλŠ”λ‹€. μ‹€μ œλ‘œ μž„μ˜μ˜ μœ ν˜• a에 λŒ€ν•΄, [a]λŠ” Enum μœ ν˜•ν΄λž˜μŠ€μ— ν¬ν•¨λ˜μ§€ μ•ŠλŠ”λ‹€.

In [62]:
succ 1
2
In [63]:
pred 1
0
In [64]:
succ 'c'
'd'
In [65]:
pred 'c'
'b'

μœ ν˜•μ— 따라 νŠΉμ • 값은 이전값 λ˜λŠ” λ‹€μŒκ°’μ΄ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€. 예λ₯Ό λ“€μ–΄, Ordering μœ ν˜•μ˜ LTλŠ” 이전값이, GTλŠ” 이후 값을 갖지 μ•ŠλŠ”λ‹€.

In [66]:
pred LT
Prelude.Enum.Ordering.pred: bad argument
In [67]:
pred EQ
LT

In [68]:
succ EQ
GT
In [69]:
succ GT
Prelude.Enum.Ordering.succ: bad argument

λ†€λ‘­κ²Œλ„ Float와 Double λ˜ν•œ Enum μœ ν˜•ν΄λž˜μŠ€μ— μ†ν•œλ‹€. 사싀 μˆ˜ν•™μ μœΌλ‘œ μœ λ¦¬μˆ˜λŠ” 열거될 수 μ—†λ‹€. 예λ₯Ό λ“€μ–΄, 0.1 λ°”λ‘œ λ‹€μŒμ˜ μœ λ¦¬μˆ˜λŠ” μˆ˜ν•™μ μœΌλ‘œ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€. ν•˜μ§€λ©΄ ν•˜μŠ€μΌˆμ€ 1을 λΉΌκ±°λ‚˜ λ”ν•œ 값을 이전값과 λ‹€μŒκ°’μœΌλ‘œ μ‚¬μš©ν•œλ‹€.

In [70]:
succ 0.1
1.1
In [71]:
pred 0.1
-0.9

Enum μœ ν˜•ν΄λž˜μŠ€μ˜ κ°€μž₯ 큰 ν™œμš©μ„±μ€ λ ˆμΈμ§€(range)이닀. 이전값과 λ‹€μŒκ°’μ΄ μ§€μ •λ˜μ–΄ μžˆμ„ λ•Œ μ–΄λ””μ—μ„œ μ–΄λ””κΉŒμ§€ λΌλŠ” ν‘œν˜„μ΄ μ˜λ―Έν•˜λŠ” λ°”λ₯Ό λ ˆμΈμ§€κ°€ μ •ν™•ν•˜κ²Œ λ°˜μ˜ν•œλ‹€.

In [72]:
['a'..'e']
"abcde"
In [73]:
[LT .. GT]
[LT,EQ,GT]
In [74]:
[3 .. 5]
[3,4,5]
In [75]:
succ 'B'
'C'

Bounded 유형클래스

μœ ν˜•μ˜ 값이 κ°€μ§ˆ 수 μžˆλŠ” μ΅œμ†Ÿκ°’(minBound)κ³Ό μ΅œλŒ“κ°’(maxBound)이 μ‘΄μž¬ν•˜λŠ” 경우 κ·Έ μœ ν˜•μ€ Bounded μœ ν˜•ν΄λž˜μŠ€μ— μ†ν•œλ‹€.

μ£Όμ˜μ‚¬ν•­: μœ ν˜•λ³„ minBound와 maxBoundλ₯Ό 확인할 λ•Œ μ›λž˜ μ†Œκ΄„ν˜Έλ₯Ό μ‚¬μš©ν•  ν•„μš”κ°€ μ—†μ§€λ§Œ, μ£Όν”Όν„° λ…ΈνŠΈλΆ μ…€μ—μ„œ μž‘μ„±ν•˜λŠ” 경우 μ†Œκ΄„ν˜Έλ₯Ό ν•¨κ»˜ μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©΄ 였λ₯˜κ°€ λ°œμƒν•œλ‹€.

μžμ‹ μ˜ μ»΄ν“¨ν„°μ—μ„œ μ§€μ›ν•˜λŠ” μ΅œμ†Œμ˜/μ΅œλŒ€μ˜ Intμœ ν˜• μ •μˆ˜λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

In [76]:
(minBound :: Int)
-9223372036854775808
In [77]:
(maxBound :: Int)
9223372036854775807

문자의 μ΅œμ†Ÿκ°’κ³Ό μ΅œλŒ“κ°’μ€ μ•„λž˜μ™€ κ°™λ‹€.

In [78]:
(minBound :: Char)
'\NUL'
In [79]:
(maxBound :: Char)
'\1114111'

μ§„λ¦¬κ°’μ˜ μ΅œμ†Ÿκ°’κ³Ό μ΅œλŒ“κ°’μ€ μ•„λž˜μ™€ κ°™λ‹€.

In [80]:
(maxBound :: Bool)
True
In [81]:
(minBound :: Bool)
False
  • Bounded에 μ†ν•˜λŠ” μœ ν˜•μœΌλ‘œλ§Œ 이루어진 νŠœν”Œ μœ ν˜• λ˜ν•œ Bounded μœ ν˜•ν΄λž˜μŠ€μ— μ†ν•œλ‹€.
In [82]:
(maxBound :: (Bool, Int, Char))
(True,9223372036854775807,'\1114111')

Num 유형클래스

수(number)둜 취급될 수 μžˆλŠ” κ°’λ“€μ˜ μœ ν˜•μ΄ μ†ν•˜λŠ” μœ ν˜•ν΄λž˜μŠ€μ΄λ‹€. μš°λ¦¬κ°€ μΌμƒμ μœΌλ‘œ μ‚¬μš©ν•˜λŠ” μˆ˜λŠ” Num μœ ν˜•ν΄λž˜μŠ€μ— μ†ν•˜λŠ” λ‹€μ–‘ν•œ μœ ν˜•μ˜ 값이닀. 예λ₯Ό λ“€μ–΄, 20은 Num μœ ν˜•ν΄λž˜μŠ€μ— μ†ν•˜λŠ” μž„μ˜μ˜ μœ ν˜•μ— μ†ν•œλ‹€.

In [83]:
:t 20
20 :: forall p. Num p => p

λ”°λΌμ„œ Num μœ ν˜•ν΄λž˜μŠ€μ— μ†ν•˜λŠ” λͺ¨λ“  μœ ν˜•μ˜ κ°’μœΌλ‘œ 취급될 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ λ‹€μŒκ³Ό κ°™λ‹€.

In [84]:
20 :: Int
20
In [85]:
20 :: Integer
20
In [86]:
20 :: Float
20.0
In [87]:
20 :: Double
20.0

수의 μ—°μ‚°κ³Ό κ΄€λ ¨λœ ν•¨μˆ˜λŠ” 기본적으둜 Num μœ ν˜•ν΄λž˜μŠ€μ— μ†ν•˜λŠ” μœ ν˜•λ§Œμ„ λŒ€μƒμœΌλ‘œ ν•œλ‹€. 예λ₯Ό λ“€μ–΄, *의 μœ ν˜•μ„ ν™•μΈν•΄λ³΄μž.

In [88]:
:t (*)
(*) :: forall a. Num a => a -> a -> a

즉, κ³±μ…ˆ μ—°μ‚°μž(*)λŠ” Num μœ ν˜•ν΄λž˜μŠ€μ— μ†ν•˜λŠ” μœ ν˜•μ— λŒ€ν•΄μ„œλ§Œ μž‘λ™ν•˜λ©°, μ‚¬μš©λ˜λŠ” 두 인자의 μœ ν˜•μ΄ 동일해야 ν•œλ‹€.

예λ₯Ό λ“€μ–΄ μ•„λž˜ ν‘œν˜„μ‹μ˜ 계산은 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚€λŠ”λ°, μ΄μœ λŠ” 두 κ°’μ˜ μœ ν˜•μ΄ λ‹€λ₯΄κ²Œ μ§€μ •λ˜μ—ˆκΈ° λ•Œλ¬Έμ΄λ‹€.

In [89]:
(5 :: Int) * (6 :: Integer)
<interactive>:1:15: error:
    β€’ Couldn't match expected type β€˜Int’ with actual type β€˜Integer’
    β€’ In the second argument of β€˜(*)’, namely β€˜(6 :: Integer)’
      In the expression: (5 :: Int) * (6 :: Integer)
      In an equation for β€˜it’: it = (5 :: Int) * (6 :: Integer)

λ°˜λ©΄μ— μ•„λž˜ ν‘œν˜„μ‹μ˜ 계산은 잘 μž‘λ™ν•œλ‹€. μ΄μœ λŠ” 5의 μœ ν˜•μ΄ λ¬Έλ§₯상 Integer둜 지정될 수 있기 λ•Œλ¬Έμ΄λ‹€.

In [90]:
5 * (6 :: Integer)
30

Fractional 유형클래스

λ‚˜λˆ—μ…ˆκ³Ό κ³±μ…ˆμ˜ μ—­μ›ν•¨μˆ˜μ— λŒ€ν•΄ λ‹«ν˜€ μžˆλŠ” μœ ν˜•μ˜ ν΄λž˜μŠ€μ΄λ‹€. Float와 Double이 여기에 μ†ν•œλ‹€.

Integral 유형클래스

μ •μˆ˜μ™€ κ΄€λ ¨λœ μœ ν˜•μΈ Int와 Integerκ°€ 여기에 ν¬ν•¨λœλ‹€. 보닀 μ—„λ°€ν•˜κ²ŒλŠ” λͺ«κ³Ό λ‚˜λ¨Έμ§€ 연산을 μ§€μ›ν•˜λŠ” μœ ν˜•λ“€μ΄μ–΄μ•Ό ν•œλ‹€.

Floating 유형클래스

log, exp, sin, cos λ“± μ •μˆ˜ λ²”μœ„λ₯Ό λ„˜μ–΄μ„œλŠ” 연산을 λ‹€λ£° 수 μžˆλŠ” μœ ν˜•λ“€μ΄ μ†ν•œλ‹€. λŒ€ν‘œμ μœΌλ‘œ Float, Double이 μžˆλ‹€.

수치 함수의 유형

μˆ˜μ™€ κ΄€λ ¨λœ μœ ν˜•ν΄λž˜μŠ€λ₯Ό μ‚΄νŽ΄λ³΄μ•˜μœΌλ‹ˆ 이제 수λ₯Ό λ‹€λ£¨λŠ” ν•¨μˆ˜λ“€μ„ μ’€ 더 ꡬ체적으둜 이해할 수 μžˆλ‹€. 사싀 수치 ν•¨μˆ˜λ“€μ€ κ½€ λ³΅μž‘ν•œ μœ ν˜•μ„ κ°–λŠ”λ‹€. μ—¬κΈ°μ„œλŠ” μ„€λͺ…을 μœ„ν•΄ fromIntegral ν•¨μˆ˜λ₯Ό μ΄μš©ν•œλ‹€.

λ¨Όμ € μœ ν˜•μ„ ν™•μΈν•΄λ³΄μž.

In [91]:
:t fromIntegral
fromIntegral :: forall a b. (Integral a, Num b) => a -> b

λ¨Όμ €, μœ ν˜•μ— μ‚¬μš©λ˜λŠ” 클래슀 μ œμ•½μ΄ 두 κ°œμž„μ΄λ©°, μ†Œκ΄„ν˜Έ μ•ˆμ—μ„œ μ‰Όν‘œλ‘œ κ΅¬λΆ„λ˜μ–΄ μžˆμŒμ— μ£Όλͺ©ν•΄μ•Ό ν•œλ‹€.

  • 인자: Integral μœ ν˜•ν΄λž˜μŠ€μ— μ†ν•˜λŠ” μœ ν˜• a의 κ°’
  • λ°˜ν™˜κ°’: Num μœ ν˜•ν΄λž˜μŠ€μ— μ†ν•˜λŠ” μœ ν˜• b의 κ°’

즉, fromIntegral ν•¨μˆ˜λŠ” μ •μˆ˜ν˜• 수λ₯Ό μž„μ˜μ˜ μœ ν˜•μ˜ 수둜 λ³€ν™˜μ‹œμΌœμ£Όλ©°, μ•„λž˜ μ˜ˆμ œμ™€ 같은 κ²½μš°μ— μœ μš©ν•˜κ²Œ ν™œμš©λœλ‹€.

예제

리슀트의 길이λ₯Ό λ°˜ν™˜ν•˜λŠ” length ν•¨μˆ˜μ˜ μœ ν˜•μ€ λ‹€μŒκ³Ό κ°™λ‹€.

In [92]:
:t length
length :: forall (t :: * -> *) a. Foldable t => t a -> Int

이전에 elem ν•¨μˆ˜μ˜ μœ ν˜•μ—μ„œ μ–ΈκΈ‰ν•œ λŒ€λ‘œ μ•„λž˜ 두 사항을 μ μš©ν•΄λ³΄μž.

  • t a: [a]둜 이해할 것.
  • Foldable t: μ—¬κΈ°μ„  λ¬΄μ‹œ.

그러면 length의 μœ ν˜•μ€ μ•„λž˜μ™€ 같이 이해될 수 μžˆλ‹€.

forall a. [a] -> Int

μ—¬κΈ°μ„œ μ£Όλͺ©ν•΄μ•Όν•  사항은 λ°˜ν™˜κ°’μ˜ μœ ν˜•μ΄ Int λΌλŠ” 것이닀. μ•„λ§ˆλ„ μ•„λž˜μ™€ 같이 ν•˜λ©΄ 더 μ’‹μ•˜μ„ν…λ° μ–΄λ–€ 역사적인 μ΄μœ μ—μ„œ Int 둜 μ •ν•΄μ‘Œλ‹€.

forall a. Num b => [a] -> b

이런 이유둜 ν•΄μ„œ μ•„λž˜μ™€ 같은 경우 λ¬Έμ œκ°€ λ°œμƒν•œλ‹€.

In [93]:
length [1,2,3,4] + 3.2
<interactive>:1:20: error:
    β€’ No instance for (Fractional Int) arising from the literal β€˜3.2’
    β€’ In the second argument of β€˜(+)’, namely β€˜3.2’
      In the expression: length [1, 2, 3, 4] + 3.2
      In an equation for β€˜it’: it = length [1, 2, 3, ....] + 3.2

μ΄μœ λŠ” 4 :: Int 와 λΆ€λ™μ†Œμˆ˜μ  3.2κ°€ μ„œλ‘œ μœ ν˜•μ΄ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ΄λ‹€. 이런 경우 fromIntegral ν•¨μˆ˜λ₯Ό ν™œμš©ν•˜λ©΄ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€.

In [94]:
fromIntegral (length [1,2,3,4]) + 3.2
7.2

μ΄μœ λŠ” fromIntegral ν•¨μˆ˜μ— μ˜ν•΄ 4 :: Intκ°€ μž„μ˜μ˜ Num μœ ν˜•ν΄λž˜μŠ€μ— μ†ν•˜λŠ” μœ ν˜•μœΌλ‘œ λ³€ν™˜λ  수 있기 λ•Œλ¬Έμ΄λ‹€.