λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ“  archive

[Haskell Tutorial] Type

by HandHand 2022. 11. 28.

 

πŸ“Œ νƒ€μž…μΆ”λ‘ 

Haskell 은 νƒ€μž… 좔둠이 κ°€λŠ₯ν•˜μ§€λ§Œ 보톡 λͺ…μ‹œμ μœΌλ‘œ νƒ€μž…μ„ λͺ…μ‹œν•˜λŠ” 것이

미래의 λ‚˜μ™€ λ‹€λ₯Έ 이듀을 μœ„ν•΄ 더 λ‚˜μ€ μ„ νƒμž…λ‹ˆλ‹€.

νƒ€μž…μ€ μ‹λ³„μž μœ„μ— :: 와 ν•¨κ»˜ λͺ…μ‹œν•©λ‹ˆλ‹€.

 

title_ :: String -> String

 

μœ„ νƒ€μž…μ€ String 을 인자둜 λ°›μ•„ String 을 λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λ₯Ό μ˜λ―Έν•˜λŠ” 것이죠.

 

πŸ“Œ Haskell 의 ν•¨μˆ˜λŠ” 일급 ν΄λž˜μŠ€λ‹€.

사싀 μ•žμ„  λͺ¨λ“  μ˜ˆμ œμ—μ„œ 2개 μ΄μƒμ˜ 인자λ₯Ό λ°›λŠ” ν•¨μˆ˜λ“€μ„ μ •μ˜ν–ˆμ§€λ§Œ

사싀 Haskell μ—μ„œ λͺ¨λ“  ν•¨μˆ˜λŠ” ν•˜λ‚˜μ˜ 인자λ₯Ό 받도둝 λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€.

 

makeHtml :: String -> String -> String

 

이전에 μž‘μ„±ν•œ makeHtml 은 λ‘κ°œμ˜ String 인자λ₯Ό λ°›μ•„ ν•˜λ‚˜μ˜ String 을 λ°˜ν™˜ν•˜λ„λ‘ λ˜μ–΄μžˆμ—ˆλŠ”λ°,

사싀 μ΄λŠ” λ‹€μŒκ³Ό 같이 ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜ νƒ€μž…μœΌλ‘œ λ³€ν™˜λ©λ‹ˆλ‹€.

 

makeHtml :: String -> (String -> String)

 

Haskell μ—μ„œ λͺ¨λ“  ν•¨μˆ˜λŠ” 일급 클래슀 μž…λ‹ˆλ‹€.

λ•Œλ¬Έμ— κ°’μœΌλ‘œ λ‹€λ£° 수 있고, ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λ₯Ό μ •μ˜ν•  수 있죠.

이λ₯Ό ν”νžˆ κ³ μ°¨ ν•¨μˆ˜ 라고 λΆ€λ₯΄κΈ°λ„ ν•©λ‹ˆλ‹€.

 

Haskell μ—λŠ” λ‹€λ₯Έ ν•¨μˆ˜ν˜• 언어와 λ§ˆμ°¬κ°€μ§€λ‘œ 읡λͺ…ν•¨μˆ˜(λžŒλ‹€ν•¨μˆ˜) λ₯Ό μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

말 κ·ΈλŒ€λ‘œ 이름이 μ—†λŠ” ν•¨μˆ˜μ΄λ©°, λ‹€μŒκ³Ό 같이 μž‘μ„±ν•©λ‹ˆλ‹€.

 

\<argument> -> <expression>

 

1κ³Ό 2λ₯Ό 인자둜 λ°›μ•„ λ”ν•˜λŠ” three ν•¨μˆ˜λŠ” λ‹€μŒκ³Ό 같이 μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

three = (\num1 -> \num2 -> num1 + num2) 1 2

 

λ˜λŠ” λ‹€μŒκ³Ό 같이 μΆ•μ•½ν•˜μ—¬ ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

three = (\num1 num2 -> num1 + num2) 1 2

 

이λ₯Ό μš°λ¦¬κ°€ λ§Œλ“  makeHtml 에 μ μš©ν•˜λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 

makeHtml = (\title body -> html_ (head_ (title_ title) <> body_ body)) "Hello World!" "This is body"

 

πŸ“Œ μƒˆλ‘œμš΄ νƒ€μž… μ •μ˜ν•˜κΈ°

 

Haskell μ—μ„œλŠ” newtype κ³Ό type 을 ν†΅ν•΄μ„œ μƒˆλ‘œμš΄ νƒ€μž…μ„ λΆ€μ—¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

newtype

newtype 은 기쑴의 νƒ€μž…μ— μƒˆλ‘œμš΄ 이름을 λΆ€μ—¬ν•΄μ€λ‹ˆλ‹€.

문법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 

newtype <type-name> = <constructor> <existing-type>

{- example -}
newtype Html = Html String

μ—¬κΈ°μ„œ μƒμ„±μž(constructor)λŠ” μš°λ¦¬κ°€ μ •μ˜ν•œ newtype 을 μƒμ„±ν•˜λŠ” ν•¨μˆ˜λΌκ³  생각해도 λ©λ‹ˆλ‹€.

보편적으둜 μƒμ„±μžμ΄λ¦„κ³Ό νƒ€μž…μ΄λ¦„μ„ λ™μΌν•˜κ²Œ μ •μ˜ν•˜μ§€λ§Œ 달라도 사싀 μƒκ΄€μ—†μŠ΅λ‹ˆλ‹€.

 

μœ„ μ˜ˆμ‹œλŠ” Htmlμ΄λΌλŠ” μƒˆλ‘œμš΄ νƒ€μž…μ€ String을 ν‘œν˜„μ‹μœΌλ‘œ μ‚¬μš©ν•˜λŠ” Html μƒμ„±μžλ‘œ λ§Œλ“€μ–΄μ§„λ‹€ λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

(Html "hello" 에 λŒ€μ‘λ  κ²ƒμž…λ‹ˆλ‹€.)

μ—¬κΈ°μ„œ μƒμ„±ν•œ νƒ€μž…μ΄ 아무리 String 을 λ°˜ν™˜ν•˜λ”λΌλ„, 이전에 μš°λ¦¬κ°€ ν•œκ²ƒ 처럼 append 연산을 μˆ˜ν–‰ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

 

"hello" <> Html "world" // ❌ type error!

 

μ΄λŠ” Html νƒ€μž…μ΄ μ—„μ—°νžˆ String νƒ€μž…κ³ΌλŠ” λ‹€λ₯΄κΈ° λ•Œλ¬ΈμΈλ°,

이λ₯Ό 톡해 μš°λ¦¬λŠ” νƒ€μž…κ°„μ— μΊ‘μŠν™” λ₯Ό κ΅¬ν˜„ν•  수 있게 λ©λ‹ˆλ‹€.

 

newtype μΆ”μΆœν•˜κΈ°

newtype 이 감싸고 μžˆλŠ” type 을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” 두 가지 방법이 μžˆμŠ΅λ‹ˆλ‹€.

 

1️⃣ switch ν‘œν˜„μ‹ + νŒ¨ν„΄ 맀칭 μ‚¬μš©ν•˜κΈ°

 

switch ν‘œν˜„μ‹ 을 μ΄μš©ν•˜λ©΄ case 문에 νŒ¨ν„΄ 맀칭을 톡해 νƒ€μž…μ„ μΆ”μΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

case <expression> of
  <pattern> -> <unpacked-type>

 

μ—¬κΈ°μ„œ expression 은 μΆ”μΆœμ„ μ›ν•˜λŠ” λŒ€μƒμ΄κ³ , pattern 은 ꡬ체적인 νƒ€μž… ν˜•νƒœμž…λ‹ˆλ‹€.

μ˜ˆμ‹œλ₯Ό 톡해 μ‚¬μš©λ²•μ„ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

λ§Œμ•½ λ‹€μŒκ³Ό 같은 Structure νƒ€μž…μ΄ μžˆλ‹€κ³  ν•œλ‹€λ©΄,

 

newtype Structure = Structure String

 

μ•„λž˜μ™€ 같이 μΆ”μΆœμ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.

 

getStructureString :: Structure -> String
getStructureString struct = 
    case struct of
        Structure str -> str

 

2️⃣ ν•¨μˆ˜μ˜ μΈμžμ—μ„œ νŒ¨ν„΄ 맀칭 μ‚¬μš©ν•˜κΈ°

 

λ³„λ„μ˜ μΆ”μΆœ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” λŒ€μ‹ , ν•΄λ‹Ή νƒ€μž…μ„ μ‚¬μš©ν•˜λ €λŠ” ν•¨μˆ˜μ˜ μΈμžμ—μ„œ νŒ¨ν„΄ 맀칭을 ν•˜λŠ” 방법도 μžˆμŠ΅λ‹ˆλ‹€.

 

func <pattern> = <expression>

 

이 λ°©λ²•μœΌλ‘œ getStructureString λ₯Ό μ •μ˜ν•˜λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 

getStructureString :: Structure -> String
getStructureString (Structure str) = str 

 

type

Haskell 의 type 은 κ·Έλƒ₯ type alias μž…λ‹ˆλ‹€.

λ³„λ„μ˜ νƒ€μž… μƒμ„±μžκ°€ μ—†μœΌλ©°, νŠΉμ • νƒ€μž…μ— 별칭을 μ •ν•΄μ£ΌλŠ” μš©λ„μž…λ‹ˆλ‹€.

이λ₯Ό 톡해 νŠΉμ • μƒν™©μ—μ„œ μ’€ 더 λͺ…μ‹œμ μΈ 타이핑이 κ°€λŠ₯ν•΄μ§‘λ‹ˆλ‹€.

 

type <type-name> = <existing-type>

{- example -}
type Title = String
λ°˜μ‘ν˜•

'πŸ“  archive' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Haskell Tutorial] High Order Function  (0) 2022.12.31
[Haskell Tutorial] Module  (0) 2022.11.28
[Haskell Tutorial] Function & Chaining  (0) 2022.11.28
[Haskell Tutorial] Hello World!  (0) 2022.11.28
[Design Pattern] PUB-SUB νŒ¨ν„΄  (0) 2022.06.13

πŸ’¬ λŒ“κΈ€