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

[Haskell Tutorial] Function & Chaining

by HandHand 2022. 11. 28.

 

πŸ’‘ ν•΄λ‹Ή ν¬μŠ€νŠΈλŠ” Learn Haskell by building a blog generator λ₯Ό μ •λ¦¬ν•œ λ‚΄μš©μž…λ‹ˆλ‹€.

 

πŸ“Œ ν•¨μˆ˜

Haskell 의 ν•¨μˆ˜λŠ” λ‹€μŒκ³Ό 같이 μ •μ˜ν•©λ‹ˆλ‹€.

 

<name> <arg> <arg> ... = <expression>

 

μ΄λ•Œ ν•¨μˆ˜ 이름은 camelCase λ₯Ό 보편적으둜 μ‚¬μš©ν•©λ‹ˆλ‹€.

content λΌλŠ” 인자λ₯Ό λ°›μ•„ λ¬Έμžμ—΄μ„ λ§Œλ“€μ–΄μ„œ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•΄λ΄…μ‹œλ‹€.

 

wrapHtml content = "<html><body>" <> content <> "</body></html>"

 

이제 이 ν•¨μˆ˜μ˜ κ²°κ³Όλ₯Ό μ½˜μ†”μ— 좜λ ₯ν•©λ‹ˆλ‹€.

 

main = putStrLn (wrapHtml "Hello World!")

 

어라? μ—¬κΈ°μ„œλŠ” κ΄„ν˜Έκ°€ μ‚¬μš©λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

Haskell 은 기본적으둜 κ΄„ν˜Έ 없이도 ν•¨μˆ˜ 호좜이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

λ‹€λ§Œ μœ„μ™€ 같이 κ΄„ν˜Έλ₯Ό λ¬Άμ–΄μ„œ ν˜ΈμΆœν•˜λ©΄ ν•΄λ‹Ή ν‘œν˜„μ‹μ˜ 결과둜 λŒ€μΉ˜λ©λ‹ˆλ‹€.

putStrLn ν•¨μˆ˜κ°€ ν•˜λ‚˜μ˜ 인자λ₯Ό λ°›κΈ° λ•Œλ¬Έμ— μœ„μ™€ 같이 ν˜ΈμΆœν•©λ‹ˆλ‹€.

 

πŸ“Œ ν•©μ„± ν•¨μˆ˜

Haskell μ—λŠ” 체이닝 μ—°μ‚°μž(.)둜 두 ν•¨μˆ˜λ₯Ό ν•©μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

(.) :: (b -> c) -> (a -> b) -> a -> c

 

μœ„λŠ” 체이닝 μ—°μ‚°μžμ˜ νƒ€μž…μ„ λͺ…μ‹œν•œ κ²ƒμž…λ‹ˆλ‹€.

참고둜 Haskell μ—μ„œ νƒ€μž…μ„ μ†Œλ¬Έμžλ‘œ μž‘μ„±ν•  경우 μ œλ„€λ¦­μ„ μ˜λ―Έν•©λ‹ˆλ‹€.

(νƒ€μž…μ— λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ λ‹€μŒ ν¬μŠ€νŠΈμ—μ„œ μ§„ν–‰λ©λ‹ˆλ‹€.)

 

μ—¬κΈ°μ„œ -> λŠ” right associative ν•˜κΈ° λ•Œλ¬Έμ— μ•„λž˜μ™€ 같이 ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

(.) :: (b -> c) -> (a -> b) -> (a -> c)

 

μœ„ ν˜•νƒœλ₯Ό 보면 두 ν•¨μˆ˜λ₯Ό 인자둜 ν•˜λŠ” μƒˆλ‘œμš΄ ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” κ²ƒμœΌλ‘œ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

 

πŸ’‘ μ˜ˆμ‹œλ₯Ό 톡해 ν•©μ„± κ³Όμ • μ‚΄νŽ΄λ³΄κΈ°

μ˜ˆμ‹œλ₯Ό ν†΅ν•΄μ„œ λ™μž‘ 방식을 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

λ‹€μŒκ³Ό 같은 νƒ€μž…μ„ κ°€μ§€λŠ” 2가지 ν•¨μˆ˜κ°€ μžˆλ‹€κ³  ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

1. Structure :: String -> Structure
2. el "p" :: String -> String

 

이 두 ν•¨μˆ˜λ₯Ό ν•©μ„±ν•œ λ‹€μŒ ν•¨μˆ˜κ°€ String -> Structure νƒ€μž…μΈ 이유λ₯Ό

ν•¨μˆ˜ ν•©μ„± 과정을 ν•˜λ‚˜μ”© μ‚΄νŽ΄λ³΄λ©° μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

 Structure . el "p" :: String -> Structure

 

λ¨Όμ € 체이닝 μ—°μ‚°μžλŠ” λ‹€μŒ μ‹œκ·Έλ‹ˆμ²˜λ₯Ό κ°€μ§‘λ‹ˆλ‹€.

 

(.) :: (b -> c) -> (a -> b) -> a -> c

 

μ—¬κΈ°μ„œ (b -> c) λŠ” Structure , (a -> b) λŠ” el "p" 와 λŒ€μΉ˜λ©λ‹ˆλ‹€.

이λ₯Ό 톡해 μ œλ„€λ¦­ νƒ€μž… a, b, c 의 νƒ€μž…μ„ 좔둠해보면 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 

Structure :: String -> Structure 
=> (b -> c)
=> b = String, c = Structure

el "p" :: String -> String
=> (a -> b)
=> a = String, b = String

 

μ•žμ„œ -> λŠ” right associative ν•˜λ‹€κ³  ν–ˆμ—ˆλ˜ 것 κΈ°μ–΅ν•˜μ‹œλ‚˜μš”?

λ•Œλ¬Έμ— 체이닝 μ—°μ‚°μž νƒ€μž…μ„ λ‹€μŒκ³Ό 같이 μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

(.) :: (b -> c) -> (a -> b) -> (a -> c)

 

두 ν•¨μˆ˜λ₯Ό 인자둜 λ°›μ•„ ν•©μ„±λœ μƒˆλ‘œμš΄ ν•¨μˆ˜λŠ” (a -> c) νƒ€μž…μ„ 가지며,

μš°λ¦¬κ°€ μœ„μ—μ„œ μΆ”λ‘ ν•œ νƒ€μž…μ„ λŒ€μž…ν•˜λ©΄ String -> Structure κ°€ λ©λ‹ˆλ‹€.

 

λ°˜μ‘ν˜•

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

[Haskell Tutorial] Module  (0) 2022.11.28
[Haskell Tutorial] Type  (0) 2022.11.28
[Haskell Tutorial] Hello World!  (0) 2022.11.28
[Design Pattern] PUB-SUB νŒ¨ν„΄  (0) 2022.06.13
JWT (JSON Web Token)  (0) 2022.05.23

πŸ’¬ λŒ“κΈ€