Reminder: we have the #Bangalore #FPIndia #meetup this Saturday at Pre6! We have two planned talks - 1. Abhinav will talk about type level programming in #Haskell 2. Srijan will talk about #MachineLearning in pure languages, specifically with #HaskTorch hasgeek.com/fpindia/bang...

Bangalore FP June 2026 meetup
Bangalore FP June 2026 meetup

Bangalore FP June 2026 meetup

Reminder: we have the #Bangalore #FPIndia #meetup this Saturday at Pre6! We have two planned talks -

1. Abhinav will talk about type level programming in #Haskell
2. Srijan will talk about #MachineLearning in pure languages, specifically with #HaskTorch

https://hasgeek.com/fpindia/bangalore-fp-june-2026-meetup/

Bangalore FP June 2026 meetup

Bangalore FP June 2026 meetup

Hasktorch lร  thฦฐ viแป‡n liรชn kแบฟt Haskell cho LibTorch, giรบp phรกt triแปƒn hแปc sรขu (deep learning) hiแป‡u quแบฃ. Nรณ sแปญ dแปฅng FFI ฤ‘แปƒ kแบฟt nแป‘i, mang lแบกi sแปฉc mแบกnh cแปงa LibTorch vร o mรดi trฦฐแปng Haskell.
#Hasktorch #Haskell #LibTorch #DeepLearning #AI #KhoaHocDuLieu #HocSau

https://www.reddit.com/r/programming/comments/1pbfba1/hasktorch_libtorch_haskell_bindings_for_deep/

Hasktorch lร  thฦฐ viแป‡n mแป›i mang LibTorch (core cแปงa PyTorch) ฤ‘แบฟn vแป›i Haskell thรดng qua FFI, mแปŸ ra cฦก hแป™i phรกt triแปƒn แปฉng dแปฅng hแปc sรขu mแบกnh mแบฝ bแบฑng ngรดn ngแปฏ functional nร y. Khรกm phรก Deep Learning trรชn Haskell!

#Hasktorch #Haskell #DeepLearning #LibTorch #FFI #Programming #HocSau #LapTrinh #ThuVien

https://www.reddit.com/r/programming/comments/1pbfba1/hasktorch_libtorch_haskell_bindings_for_deep/

๊ฑฐ๊พธ๋กœ ์ƒํƒœ ๋ชจ๋‚˜๋“œ๋กœ ๊ฐ•ํ™” ํ•™์Šต ํ•˜๊ธฐ (1/2)

https://hackers.pub/@bgl/2025/reverse-state-monad-for-reinforcement-learning

๊ฑฐ๊พธ๋กœ ์ƒํƒœ ๋ชจ๋‚˜๋“œ๋กœ ๊ฐ•ํ™” ํ•™์Šต ํ•˜๊ธฐ (1/2)

๊ธฐ๊ณ„ ํ•™์Šต์„ ์ „ํ˜€ ๋ชจ๋ฅด๊ณ  ์‚ด๋ฉด ์•ˆ ๋˜๊ฒ ๋‹ค ์‹ถ์–ด, ์–ผ๋งˆ์ „๋ถ€ํ„ฐ ํ•˜์Šค์ผˆ๋กœ ๊ณต๋ถ€ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. Hasktorch๋ผ๊ณ  ํ•˜์Šค์ผˆ์šฉ Torch ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด์ „์— ๋„์ „ํ–ˆ์„๋• MNIST๊นŒ์ง€ ํ•˜๊ณ  ๋‹ค์Œ์— ๋ญ˜ ํ•ด์•ผํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์–ด์„œ ๊ทธ๋งŒ๋’€๋Š”๋ฐ, ์ด๋ฒˆ์—” ๊ฐ•ํ™” ํ•™์Šต์œผ๋กœ ์ด์–ด๋‚˜๊ฐ€ ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. ๊ฐ•ํ™” ํ•™์Šต์€ ์ฃผ์–ด์ง„ ํ™˜๊ฒฝ์—์„œ ๋ณด์ƒ์„ ์ตœ๋Œ€ํ™”ํ•˜๋Š” ์—์ด์ „ํŠธ๋ฅผ ํ•™์Šต์‹œํ‚ค๋Š” ๊ฒƒ์œผ๋กœ, ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”์—†๋‹ค๋Š”๊ฒŒ ์žฅ์ ์ด๋‹ค. ๋Œ€์‹  ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š”๋ฐ, ๊ฐ„๋‹จํ•œ ๊ฒŒ์ž„๋„ ํ™˜๊ฒฝ์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ๋Š” ๋ฐ์ดํ„ฐ ๋ชจ์œผ๊ธฐ์™€ ๋‹ฌ๋ฆฌ ์ฆ๊ฑฐ์šด ์ผ์ด๋‹ˆ ๋งˆ๋‹คํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์ฒซ๋ฒˆ์งธ๋กœ ๋„์ „์œผ๋กœ ์Šค๋„ค์ดํฌ ๊ฒŒ์ž„์„ ๊ณจ๋ž๋Š”๋ฐ, ๋‹ค๋“ค ํ•œ๋ฒˆ์ฏค์€ ํ•ด๋ดค์„ ๊ฒƒ์ด๋‹ค. ๋ฑ€์„ ์กฐ์ข…ํ•ด ๋จน์ด๋ฅผ ์ตœ๋Œ€ํ•œ ๋งŽ์ด ๋จน์œผ๋ฉด ๋˜๋Š”๋ฐ, ๋ฑ€์˜ ๋จธ๋ฆฌ๊ฐ€ ๋ฒฝ์ด๋‚˜ ์•„๋‹ˆ๋ฉด ์ž๊ธฐ ๋ชธํ†ต์— ๋ถ€๋”ชํžˆ๋ฉด ์ฃฝ๋Š”๋‹ค. ์—ฌ์ฐจ์—ฌ์ฐจ ํ•™์Šต์‹œ์ผœ์„œ ์ด์ •๋„๊นŒ์ง€ ํ•˜๋Š”๋ฐ์—๋Š” ์„ฑ๊ณตํ–ˆ๋‹ค. ๊ฐ•ํ™” ํ•™์Šต ์ง€์‹์ด ์ผ์ฒœํ•ด์„œ ๊ฒŒ์ž„์„ ํด๋ฆฌ์–ดํ•˜๋Š” ์ˆ˜์ค€๊นŒ์ง€๋Š” ๋ชป ๋งŒ๋“ค๊ฒ ๋‹ค. ์ด ๊ธ€์€ ํ•™์Šต์„ ์ž˜ ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋ผ, ๊ฐ•ํ™”ํ•™์Šต ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ž˜ ์งœ๋А๋ƒ์— ๋Œ€ํ•œ ๊ฒƒ์ด๋‹ค.<์ผ๋‹จ ๊ฐ•ํ™” ํ•™์Šต์ด๋ž€๊ฑธ ํ˜•์‹ํ™” ํ•ด๋ณด์ž. ์•ž์„œ ์–ธ๊ธ‰ํ•œ ํ™˜๊ฒฝ๊ณผ ์—์ด์ „ํŠธ๋ž€ ๋‹จ์–ด๋ฅผ ์–ด๋–ป๊ฒŒ ์ •์˜ํ• ์ˆ˜ ์žˆ์„๊นŒ? ๋จผ์ € ์—์ด์ „ํŠธ์˜ ์ •์˜๋Š” ์ด๋ ‡๋‹ค.type Agent = Observation -> Action<๊ด€์ธก Observation ์— ๋”ฐ๋ผ ํ–‰๋™ Action ์„ ์„ ํƒํ•œ๋‹ค. ๋‚˜๋Š” ๋ˆˆ์•ž์— ์ฝœ๋ผ๊ฐ€ ๋ณด์ด๋ฉด ๋งˆ์‹ ๋‹ค. ํ™˜๊ฒฝ์€ ์—์ด์ „ํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฌด์–ธ๊ฐ€์ด๋‹ค. ์ผ์ƒ์ ์ธ ํ‘œํ˜„์œผ๋กœ ์“ฐ์ž๋ฉด, ์—์ด์ „ํŠธ๋ฅผ ๋‘˜๋Ÿฌ์‹ผ ๋ฌด์–ธ๊ฐ€์ด๋‹ค.runAgent :: Agent -> [Action]<์ด runAgent ํ•จ์ˆ˜๊ฐ€ ํ™˜๊ฒฝ์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. Agent๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ์ฃฝ์„ ๋•Œ๊นŒ์ง€ ์„ ํƒํ•œ ํ–‰๋™๋“ค์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๊ฑด ๋„ˆ๋ฌด ์™ธ์—ฐ์ ์ธ ์ •์˜๊ณ , ํ™˜๊ฒฝ๊ณผ ์—์ด์ „ํŠธ๊ฐ€ ๋ณดํ†ต ๋งŒ์กฑํ• ๋งŒํ•œ ์กฐ๊ฑด์„ ๋‚˜์—ดํ•ด๋ณด์ž๋ฉด ์ด๋ ‡๋‹ค.ํ™˜๊ฒฝ์€ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ๋œ๋‹ค์ƒํƒœ๋Š” ์—์ด์ „ํŠธ๊ฐ€ ๋ฌด์—‡์„ ๊ด€์ธกํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค์—์ด์ „ํŠธ์˜ ํ–‰๋™์€ ๋‹ค์Œ ์ƒํƒœ์— ์˜ํ–ฅ์„ ๋ผ์นœ๋‹ค<์ด ์กฐ๊ฑด๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ ํ™˜๊ฒฝ์„ ์ข€๋” ๊ตฌ์ฒด์ ์œผ๋กœ ์ •์˜ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.class Environment e where type State e type Observation e type Action e update :: (State e, Action e) -> State e -- ์กฐ๊ฑด 1, 3 observe :: State e -> Observation e -- ์กฐ๊ฑด 2<์Šค๋„ค์ดํฌ ๊ฒŒ์ž„์—์„œ ์ƒํƒœ๋Š” ๋ฑ€์˜ ๋ชจ์–‘๊ณผ ๋จน์ด์˜ ์œ„์น˜, ๊ด€์ธก์€ ์ƒํƒœ์™€ ๊ฐ™๊ณ (ํ”Œ๋ ˆ์ด์–ด๋Š” ์ „์ฒด ๊ฒŒ์ž„ ํ™”๋ฉด์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค), ํ–‰๋™์€ ์ขŒํšŒ์ „๊ณผ ์šฐํšŒ์ „์ด ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ฑ€์ด ์•„๋ฌด๋ ‡๊ฒŒ๋‚˜ ์ขŒํšŒ์ „ ์šฐํšŒ์ „ ํ•œ๋‹ค๊ณ  ๋ฐ•์ˆ˜ ์ณ์ค„์ˆœ ์—†๊ณ , ์šฐ๋ฆฌ๋Š” ์–˜ํ•œํ…Œ ๋ฐ”๋ผ๋Š” ๊ฒŒ ์žˆ๋‹ค. ์ฃฝ์ง€์•Š๊ณ  ๋” ๋งŽ์€ ๋จน์ด๋ฅผ ๋จน์–ด์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋ฑ€์ด ์ œ๋•Œ ๋ฐฉํ–ฅ์„ ๋ฐ”๊ฟ”์„œ ๋จน์ด๋ฅผ ์ง€๋‚˜์น˜์ง€ ์•Š๊ณ  ๋จน์œผ๋ฉด ์ž˜ ํ–ˆ๋‹ค๊ณ  ๋ณด์ƒ์„ ์ฃผ์ž. ๊ทธ๋Ÿฌ๋ฉด ๋ฑ€์€ ๋ณด์ƒ์„ ๋” ๋งŽ์ด ๋ฐ›์„ ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•œ๋‹ค.type RewardFunction = (Observation, Action) -> Float<๋ณด์ƒ ํ•จ์ˆ˜๋Š” ๊ด€์ธก์™€ ํ–‰๋™์— ๋”ฐ๋ผ ๋ณด์ƒ์„ ๊ฒฐ์ •ํ•œ๋‹ค. ๊ฐ€๋ น ๋ฑ€์ด ๋จน์ด ํ•˜๋‚˜๋ฅผ ๋ƒ ๋ƒ ํ•˜๋ฉด ๋ณด์ƒ์„ 1 ์ฃผ๋ฉด ๋œ๋‹ค. ์ง€๋‚˜์ณ๋ฒ„๋ฆฌ๋ฉด 0์ ์ด๊ณ , ์ฃฝ์—ˆ์„ ๋•Œ๋Š” -1์ ์„ ์ค„ ์ˆ˜๋„ ์žˆ๋‹ค. ๋‹น๊ทผ๊ณผ ์ฑ„์ฐ์ด๋ผ ์ƒ๊ฐํ•˜๊ณ  ์ •์˜ํ•˜๋ฉด ๋œ๋‹ค. ๋˜, ๋ณด์ƒ์€ ๋”ํ•ด์„œ ๋ˆ„์ ์ด ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋Œ€์ถฉ Float์œผ๋กœ ๊ณ ๋ฅธ๋‹ค. ํ•™์Šต์„ ์‹œํ‚ค๋ ค๋ฉด ๋ณด์ƒ์„ ๊ณ„์‚ฐํ•ด์•ผํ•˜๊ณ , ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด ๊ด€์ธก๊ณผ ํ–‰๋™์„ ์ง์ง€์–ด์•ผํ•œ๋‹ค.trainAgent :: Agent -> [(Observation, Action)]<runAgent์™€ ๋‹ฌ๋ฆฌ Observation๋„ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. ์ด๋•Œ [(Observation, Action)]์„ ์—ํ”ผ์†Œ๋“œ Episode ๋ผ๊ณ  ํ•œ๋‹ค. ์—ํ”ผ์†Œ๋“œ๋กœ๋ถ€ํ„ฐ ๋ณด์ƒ์„ ๊ตฌํ•˜์ž.rewards = fmap (uncurry rewardFn) (trainAgent agent)rewardFn :: RewardFunctionagent :: Agent<...ํ•ด์น˜์› ๋‚˜? ์—ํ”ผ์†Œ๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ธฐ๋ก๋ ์ง€๋ฅผ ์‚ดํŽด๋ณด์ž.0123456789ํ–‰๋™โ†’โ†“โ†’โ†“โ†โ†‘โ†’โ†“โ†โ†“๋ณด์ƒ๐ŸŽ๐ŸŽ๐ŸŽ๐Ÿ’€<์œ„์˜ rewards์˜ ๊ฐ’์ด ์ด๋Ÿฐ ์˜๋ฏธ์ผ๊ฑฐ๋ผ๊ณ  ๋ณด์ธ๋‹ค. ์‹ค์ œ๋กœ Float ๊ฐ’์„ ํ‘œ์‹œํ•ด๋ณด์ž.0123456789ํ–‰๋™โ†’โ†“โ†’โ†“โ†โ†‘โ†’โ†“โ†โ†“๋ณด์ƒ0010011000<ํ˜น์‹œ ์ด์ƒํ•œ ๊ฑธ ์ฐพ์œผ์…จ๋‚˜์š”? ์ด๋Ÿฐ์‹์œผ๋กœ ๋ณด์ƒํ•˜๋Š”๊ฒŒ ํ‹€๋ฆฐ ๊ฑด ์•„๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์—์ด์ „ํŠธ๊ฐ€ ์žฅ๊ธฐ์ ์ธ ๊ณ„ํš์„ ์„ธ์šฐ๋„๋ก ํ•™์Šต์‹œํ‚ค์ง€ ๋ชปํ•œ๋‹ค. ๋จน์ด๋ฅผ ๋จน๋Š” ์ˆœ๊ฐ„์—๋งŒ ๋ณด์ƒ์„ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์—, ๋ฉ€๋ฆฌ ๋–จ์–ด์ง„ ๋จน์ด๋ฅผ ํ–ฅํ•ด ๋‹ค๊ฐ€๊ฐ€๊ฒŒ๋” ์œ ๋„ํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋ณด์ƒ์„ ๋’ค์—์„œ๋ถ€ํ„ฐ ๋ˆ„์ ์‹œ์ผœ์•ผ ํ•œ๋‹ค.0123456789ํ–‰๋™โ†’โ†“โ†’โ†“โ†โ†‘โ†’โ†“โ†โ†“๋ณด์ƒ3332221000rewards = scanr (+) 0 (fmap (uncurry rewardFn) (trainAgent agent))<์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ์šฉ ์ฝ”๋“œ๋ฅผ ์งœ์•ผํ• ๊ฒƒ ๊ฐ™์€ ๋А๋‚Œ์ด ๋“ค์—ˆ๋Š”๋ฐ, ๋‹คํ–‰ํžˆ scanr ํ•จ์ˆ˜ ๋•๋ถ„์— ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋‹ค. ์ข€๋” ๊ฐœ์„ ํ•ด๋ณผ๊นŒ. ์ง€๊ธˆ์˜ ๋ณด์ƒ ์ฒด๊ณ„์—์„œ ์—์ด์ „ํŠธ๋Š” ๋จผ ๋ฏธ๋ž˜๋ฅผ ๊ณ ๋ คํ•˜๋ฉฐ ์„ ํƒํ•˜๋Š” ๊ฒƒ์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ์‚ฌ์‹ค ๋ฑ€์ด ๋งจ ์ฒ˜์Œ์— ์ขŒํšŒ์ „์„ ํ•˜๋˜ ์šฐํšŒ์ „์„ ํ•˜๋˜, ์ฃฝ๊ธฐ ์ „๊นŒ์ง€ ๋จน์ด๋ฅผ ์ด ๋ช‡๊ฐœ ๋จน๋Š”์ง€์— ์—„์ฒญ๋‚œ ์˜ํ–ฅ์„ ๋ผ์น ๊ฑฐ ๊ฐ™์ง„ ์•Š๋‹ค. ์–ด๋–ค ์‹œ์ ์—์„œ์˜ ์„ ํƒ์˜ ์˜ํ–ฅ์€ ์‹œ๊ฐ„์ด ์ง€๋‚  ์ˆ˜๋ก ์ ์  ํฌ๋ฏธํ•ด์ง„๋‹ค. ์ด ์ ์„ ๋ฐ˜์˜ํ•ด์„œ ๋ฑ€์ด ์ž˜๋ชป๋œ ํŽธ๊ฒฌ์„ ๊ฐ–์ง€ ์•Š๋„๋ก ๋„์™€์ฃผ์ž. ๋ฏธ๋ž˜์˜ ๋ณด์ƒ์„ ๋ˆ„์ ํ•˜๋˜, ๊ฐ์‡ ์œจ 0.9๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.0123456789ํ–‰๋™โ†’โ†“โ†’โ†“โ†โ†‘โ†’โ†“โ†โ†“๋ณด์ƒ1.932.152.391.541.711.901.000.000.000.00rewards = scanr (\x y -> x + 0.9 * y) 0 (fmap (uncurry rewardFn) (trainAgent agent))<์ด์ œ ๋‚˜๋จธ์ง€๋Š” GPUํ•œํ…Œ ๋งก๊ธฐ๋ฉด ๋œ๋‹ค. ์กฐ๊ธˆ๋งŒ ๊ธฐ๋‹ค๋ฆฌ๋ฉด ์œ„์˜ ๋™์˜์ƒ์—์„œ์ฒ˜๋Ÿผ ์›€์ง์ด๋Š” ๋ฑ€์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.<์—ฌ๊ธฐ์„œ GPU๋ฅผ 100์žฅ ๋” ์‚ฌ์„œ ๋ฑ€ ๋Œ€์‹ ์— ์ข€๋” ์šฐ๋ฆฌ ์‚ถ์— ๋„์›€๋˜๋Š” ์—์ด์ „ํŠธ๋ฅผ ํ•™์Šต์‹œํ‚จ๋‹ค๋ฉด, ๊ทธ๊ฑธ 10๋…„์ „์— ํ–ˆ์œผ๋ฉด, ๋‚œ ์ง€๊ธˆ ๋ถ€์ž๊ฐ€ ๋˜์–ด์žˆ์„์ง€๋„ ๋ชจ๋ฅด๊ฒ ๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐํšŒ๋Š” ์ด๋ฏธ ๋– ๋‚ฌ๊ณ , ๋‚œ ์ง€๊ธˆ ๋ˆ์€ ์—†์ง€๋งŒ ๋Œ€์‹  ์‹œ๊ฐ„์€ ๋งŽ๋‹ค. ๊ทธ ์‹œ๊ฐ„์„, ์ง€๊ธˆ์˜ ๊ทธ๋Ÿญ์ €๋Ÿญ ๋ณผ๋งŒํ•œ ์ฝ”๋“œ๋ฅผ ์ฅ๊ผฌ๋ฆฌ๋งŒํผ ๊ฐœ์„ ํ•˜๋Š”๋ฐ ๋‚ญ๋น„ํ•ด๋ณด๋ ค ํ•œ๋‹ค. ์ง€๊ธˆ ์ฝ”๋“œ์—์„œ ๋ญ๊ฐ€ ๋งˆ์Œ์— ์•ˆ๋“œ๋ƒ๋ฉด,<๋ณด์ƒ์ด ์‚ฌ์‹ค ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๊ฐœ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค ๋จน์ด๋ฅผ ๋จน์ž๋งˆ์ž ์ฆ‰๊ฐ์ ์œผ๋กœ ์ฃผ๋Š” ๋ณด์ƒ๊ณผ, ๊ทธ๊ฒƒ์„ ๋ˆ„์ ํ•œ ๋ณด์ƒ, ์ด๋ ‡๊ฒŒ ๋‘ ๊ฐœ๊ฐ€ ์žˆ๋‹ค. ์‹ค์ œ๋กœ ํ•™์Šต์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ›„์ž์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ง‰์ƒ ๋ณด์ƒ ํ•จ์ˆ˜์˜ ์ •์˜๋Š” ์ „์ž์— ๋Œ€ํ•œ ๊ฒƒ์ด๋‹ค. ์ด๋Š” ๋ณด์ƒ ํ•จ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ ๋ฏธ๋ž˜์— ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ์•Œ์ˆ˜๊ฐ€ ์—†์–ด์„œ ๊ทธ๋ ‡๋‹ค. ์ •์˜๋ฅผ ๋‘ ๊ฐœ๋กœ ๋‚˜๋ˆˆ ์ด์œ ๊ฐ€ ์˜๋ฏธ๋ฅผ ๋ช…์พŒํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๊ฐ€ ์•„๋‹ˆ๋ผ, ๊ทธ๋ƒฅ ํ•œ๋ฒˆ์— ๊ณ„์‚ฐ์„ ํ• ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.<ํ™˜๊ฒฝ์˜ ์ •์˜ ์œ„์—์„œ ์‚ดํŽด๋ณธ runAgent์˜ ์ •์˜๊ฐ€ ์ผ๊ฒฌ ์šฐ์•„ํ•ด๋ณด์ผ ์ˆ˜ ์žˆ๋‹ค. ๋ฌธ์ œ๋Š” ๊ทธ ์ •์˜๋Š” ํ™˜๊ฒฝ๊ณผ ์—์ด์ „ํŠธ๊ฐ€ ๋ชจ๋‘ ์ˆœ์ˆ˜ ํ•จ์ˆ˜์ผ ๊ฒƒ์„ ๊ฐ•์š”ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. Environment์˜ ์ •์˜๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค. ํ™˜๊ฒฝ๊ณผ ์—์ด์ „ํŠธ๋Š” ๊ฐ์ž์˜ ๋ถ€์ˆ˜ํšจ๊ณผ Side effect ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๊ฐ€๋ น ์˜จ๋ผ์ธ ๊ฒŒ์ž„์„ ํ™˜๊ฒฝ์œผ๋กœ ์‚ผ๋Š”๋‹ค๋ฉด, ํ™˜๊ฒฝ์€ ๋„คํŠธ์›Œํ‚น์„ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋˜, ์—์ด์ „ํŠธ๋Š” ๋งค๋ฒˆ ๋˜‘๊ฐ™์€ ์„ ํƒ์ด ์•„๋‹Œ ํ™•๋ฅ ์  ์„ ํƒ์„ ํ•˜๊ณ  ์‹ถ์„ํ…๋ฐ, ์ด๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋กœ์จ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.<๊ทธ๋Ÿฌ๋ฉด ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ํ—ˆ์šฉํ•˜๋ฉด ๋˜๋Š”๊ฑฐ ์•„๋ƒ?<๋งž๋‹ค. ๋‚˜์ฒ˜๋Ÿผ ์‹œ๊ฐ„์ด ๋งŽ๋‹ค๋ฉด ์ง์ ‘ ํ•ด๋ณด๋Š” ๊ฒƒ๋„ ๋‚˜์˜์ง€ ์•Š๋‹ค. ํ•˜์ง€๋งŒ ์ •์˜๊ฐ€ ์ ์  ์ง€์ €๋ถ„ํ•ด์ง€๋Š” ๊ฒƒ์„ ๋ณด๊ฒŒ๋  ๊ฒƒ์ด๊ณ ... ์‹œ๊ฐ„์„ ์•„๊ปด์ฃผ๊ธฐ ์œ„ํ•ด ์ •๋‹ต์„ ์•Œ๋ ค์ฃผ๊ฒ ๋‹ค. ํ™˜๊ฒฝ์€ ์—์ด์ „ํŠธ๊ฐ€ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋‚˜๋“œ์—ฌ์•ผ ํ•œ๋‹ค. ๋”ฑ ๊ฑฐ๊ธฐ๊นŒ์ง€์—ฌ์•ผ ํ•œ๋‹ค. ํ™˜๊ฒฝ๊ณผ ์—์ด์ „ํŠธ ์‚ฌ์ด์— ๊ทธ ์ด์ƒ์˜ ๊ด€๊ณ„๋Š” ๋ถ€์ ์ ˆํ•˜๋‹ค.<๊ธ€์ด ์ƒ๊ฐํ–ˆ๋˜ ๊ฒƒ๋ณด๋‹ค ๊ธธ์–ด์ ธ๋ฒ„๋ ค์„œ, ์˜ค๋Š˜์€ ์—ฌ๊ธฐ๊นŒ์ง€ ํ•ด์•ผ๊ฒ ๋‹ค. ์ด์–ด์ง€๋Š” ๊ธ€์—์„œ ๊ฑฐ๊พธ๋กœ ์ƒํƒœ ๋ชจ๋‚˜๋“œ๊ฐ€ ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š”์ง€ ์†Œ๊ฐœํ•œ๋‹ค. ์‚ฌ์‹ค ์•„๊นŒ ํ™˜๊ฒฝ์ด๋‹ˆ ์—์ด์ „ํŠธ๋‹ˆ ์–ด์ฉŒ๊ณ  ํ• ๋•Œ๋ถ€ํ„ฐ, ์ง„์ž‘์— ๊ฐ•ํ™” ํ•™์Šต์„ ๋งˆ์Šคํ„ฐํ•œ ํ•™์ƒ๋“ค์ด ์ด๋ฏธ ๋‹ค ์•„๋Š” ๋‚ด์šฉ์— ์ง€๊ฒจ์›Œ ์กธ๊ธฐ ์‹œ์ž‘ํ•˜๋Š”๊ฒŒ ๋ณด์˜€๋‹ค. ๋‹ค์Œ ์ˆ˜์—…์€ ์žฌ๋ฐŒ์„ํ…Œ๋‹ˆ, ๋Œ€์‹  ๊ทธ๋•Œ๊นŒ์ง€ ๋ชจ๋‚˜๋“œ๋ฅผ ๋ฐฐ์›Œ์˜ค์„ธ์š”.

Hackers' Pub
I may do a project in #hasktorch