๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“  archive29

[Haskell Tutorial] Data Type ๐Ÿ“Œ data ํƒ€์ž… Haskell ์—์„œ ํƒ€์ž…์„ ์ •์˜ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” data ์ž…๋‹ˆ๋‹ค. data = | | | ... newtype ๊ณผ ๋‹ค๋ฅด๊ฒŒ ์—ฌ๋Ÿฌ ํƒ€์ž…์ธ์ž๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ณ , ์—ฌ๋Ÿฌ constructor ๋ฅผ ํ•˜๋‚˜์˜ ํƒ€์ž…์— ๋งค์นญ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. constructor ๋’ค์— ํƒ€์ž…์ธ์ž๋Š” 0๊ฐœ ์ด์ƒ์„ ์ •์˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ data ์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. data Bool = True | False ์–ด์งธ ํ˜•ํƒœ๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์‚ฌ์šฉํ•˜๋Š” enum ๊ณผ ๋งŽ์ด ๋‹ฎ์•„์žˆ์ง€์•Š๋‚˜์š”? ๋˜๋‹ค๋ฅธ ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. data Person = Person String Int -- ์ด๋ฆ„๊ณผ ๋‚˜์ด๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” Person ํƒ€์ž… ์œ„๋Š” ์ด๋ฆ„๊ณผ ๋‚˜์ด๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” Person ํƒ€์ž…์„ ์ •์˜ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์œ„์™€ ๊ฐ™์ด .. 2022. 12. 31.
[Haskell Tutorial] Recursion ๐Ÿ“Œ ๋ฐ˜๋ณต๋ฌธ ๋Œ€์‹  ์žฌ๊ท€๋กœ Haskell ์—์„œ๋Š” ๋ฐ˜๋ณต์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด loop ๋ฅผ ์ˆœํšŒํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์žฌ๊ท€ ๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ“Œ Tail Call Elimination ์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์žฌ๊ท€ํ˜ธ์ถœ ์€ ์ฝœ์Šคํƒ์„ ์Œ“๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Haskell ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด์—์„œ๋Š” Tail-Call Elimination ๋ฅผ ํ†ตํ•ด ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ“Œ Lazy Evaluation Haskell ์€ ์ง€์—ฐ ํ‰๊ฐ€๋ฅผ ํ†ตํ•ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ’์ด ํ•„์š”ํ•œ ์‹œ์ ์— ํ‰๊ฐ€๋ฅผ ํ•˜๋ฉฐ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋ฉด ํ‰๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๐Ÿ“Œ ์˜ˆ์ œ๋กœ ์ตํžˆ๊ธฐ maximum ์€ ๋ฆฌ์ŠคํŠธ์˜ ์š”์†Œ ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. maximum' [] = error "maximum of empty list" .. 2022. 12. 31.
[Haskell Tutorial] High Order Function ์ด๋ฒˆ ํฌ์ŠคํŠธ๋Š” http://learnyouahaskell.com/higher-order-functions ์— ๊ทผ๊ฑฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ“Œ ๊ณ ์ฐจํ•จ์ˆ˜ (High Order Function) ๊ณ ์ฐจํ•จ์ˆ˜ ๋Š” ํ•จ์ˆ˜๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ฒจ์ค„ ์ˆ˜ ์žˆ๊ณ , ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ๋งˆ๋””๋กœ ํ•จ์ˆ˜๋ฅผ ๊ฐ’์œผ๋กœ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ“Œ ์ปค๋ง (Currying) Haskell ๋‹ค์ค‘์ธ์ž ํ•จ์ˆ˜์˜ ์ •์ฒด ํ•˜์Šค์ผˆ์˜ ํ•จ์ˆ˜๋Š” ํ•˜๋‚˜์˜ ์ธ์ž๋งŒ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ๋˜์–ด์žˆ๋Š”๋ฐ, ์–ด๋–ป๊ฒŒ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ธ์ž๋ฅผ ๋ฐ›๋Š” ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ผ๊นŒ์š”? ๋‘ ์ธ์ž๋ฅผ ๋ฐ›์•„ ํฐ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ max ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‘ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ghci> max 4 20 20 {- โœ… ์œ„ ํ‘œํ˜„์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. -} ghci> maxVa.. 2022. 12. 31.
[Haskell Tutorial] Module ๐Ÿ“Œ Module ๋ชจ๋“ˆ์ด๋ž€ ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ํŒŒ์ผ ๋‹จ์œ„์˜ API (ํ•จ์ˆ˜ ๋ฐ ํƒ€์ž…๋“ค) ๋ญ‰์น˜์ž…๋‹ˆ๋‹ค. Haskell ์—์„œ๋Š” ๊ฐ๊ฐ์˜ ํŒŒ์ผ์ด ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์€ ์˜๋ฌธ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๋ฉฐ(Html.hs), ๋ชจ๋“ˆ์„ ์ •์˜ํ•˜๋Š” ์ชฝ์—์„œ ์™ธ๋ถ€๋กœ ๊ณต๊ฐœํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” API ๋“ค์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- Html.hs module Html ( Html , Title , Structure , html_ , p_ , h1_ , append_ , render ) where -- ... ๊ฐ๊ฐ์˜ API ๋“ค์— ๋Œ€ํ•œ ๊ตฌํ˜„๋ถ€ ๐Ÿ“Œ Internal Module ์•ž์„œ module ์„ export ํ•œ ๋ฐฉ์‹์€ private ํ•œ ๊ธฐ๋Šฅ๋“ค์— ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Haskell ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ module ์— ๋ชจ๋‘ ์ ‘๊ทผ.. 2022. 11. 28.
[Haskell Tutorial] Type ๐Ÿ“Œ ํƒ€์ž…์ถ”๋ก  Haskell ์€ ํƒ€์ž… ์ถ”๋ก ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋ณดํ†ต ๋ช…์‹œ์ ์œผ๋กœ ํƒ€์ž…์„ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์ด ๋ฏธ๋ž˜์˜ ๋‚˜์™€ ๋‹ค๋ฅธ ์ด๋“ค์„ ์œ„ํ•ด ๋” ๋‚˜์€ ์„ ํƒ์ž…๋‹ˆ๋‹ค. ํƒ€์ž…์€ ์‹๋ณ„์ž ์œ„์— :: ์™€ ํ•จ๊ป˜ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค. title_ :: String -> String ์œ„ ํƒ€์ž…์€ String ์„ ์ธ์ž๋กœ ๋ฐ›์•„ String ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด์ฃ . ๐Ÿ“Œ Haskell ์˜ ํ•จ์ˆ˜๋Š” ์ผ๊ธ‰ ํด๋ž˜์Šค๋‹ค. ์‚ฌ์‹ค ์•ž์„  ๋ชจ๋“  ์˜ˆ์ œ์—์„œ 2๊ฐœ ์ด์ƒ์˜ ์ธ์ž๋ฅผ ๋ฐ›๋Š” ํ•จ์ˆ˜๋“ค์„ ์ •์˜ํ–ˆ์ง€๋งŒ ์‚ฌ์‹ค Haskell ์—์„œ ๋ชจ๋“  ํ•จ์ˆ˜๋Š” ํ•˜๋‚˜์˜ ์ธ์ž๋ฅผ ๋ฐ›๋„๋ก ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. makeHtml :: String -> String -> String ์ด์ „์— ์ž‘์„ฑํ•œ makeHtml ์€ ๋‘๊ฐœ์˜ String ์ธ์ž๋ฅผ ๋ฐ›์•„ ํ•˜๋‚˜์˜ String ์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๋˜์–ด์žˆ์—ˆ๋Š”๋ฐ, ์‚ฌ์‹ค ์ด๋Š” ๋‹ค.. 2022. 11. 28.
[Haskell Tutorial] Function & Chaining ๐Ÿ’ก ํ•ด๋‹น ํฌ์ŠคํŠธ๋Š” Learn Haskell by building a blog generator ๋ฅผ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ๐Ÿ“Œ ํ•จ์ˆ˜ Haskell ์˜ ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ... = ์ด๋•Œ ํ•จ์ˆ˜ ์ด๋ฆ„์€ camelCase ๋ฅผ ๋ณดํŽธ์ ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. content ๋ผ๋Š” ์ธ์ž๋ฅผ ๋ฐ›์•„ ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค์–ด์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด๋ด…์‹œ๋‹ค. wrapHtml content = "" content "" ์ด์ œ ์ด ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๋ฅผ ์ฝ˜์†”์— ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. main = putStrLn (wrapHtml "Hello World!") ์–ด๋ผ? ์—ฌ๊ธฐ์„œ๋Š” ๊ด„ํ˜ธ๊ฐ€ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Haskell ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ด„ํ˜ธ ์—†์ด๋„ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์œ„์™€ ๊ฐ™์ด ๊ด„ํ˜ธ๋ฅผ ๋ฌถ์–ด์„œ ํ˜ธ์ถœํ•˜๋ฉด ํ•ด๋‹น ํ‘œํ˜„์‹์˜ ๊ฒฐ๊ณผ๋กœ ๋Œ€์น˜๋ฉ๋‹ˆ๋‹ค. putStrLn ํ•จ์ˆ˜๊ฐ€ ํ•˜.. 2022. 11. 28.