ãã®çµæãJavaããã°ã©ããŒã¯Haskellãç¬ãã ãã§ã100äžè¡ã®ãšã³ã¿ãŒãã©ã€ãºãããžã§ã¯ãããã¯ç®ãé¢ããŸããã C ++éçºè ã¯ãè¶ é«éã¢ããªã±ãŒã·ã§ã³ã«ããããé©çšããããã«ã¹ããŒããªãã€ã³ã¿ãŒãäœæããŸãã Webéçºè ã¯ãcssãxmlãããã³javascriptã®äŸãšå·šå€§ãªä»æ§ã«ç®ãéããŸãã ãããŠãæãªãšãã«haskellãå匷ãã人ã¯ãã¢ãããšåŒã°ããä¹ãè¶ããããªãé害ã«çŽé¢ããŠããŸãã
ããã§ã ã¢ãããªãã§Haskellã§ããã°ã©ã ããæ¹æ³ãåŠã³ãŸãã
ãããè¡ãã«ã¯ãå°ãã®ç©ºãæéããããã¿ãªããããæ°ã«å ¥ãã®é£²ã¿ç©ã®ãã°ã«ãããghcã³ã³ãã€ã©ãå¿ èŠã§ãã Windowsããã³macosã§ã¯ãhaskellãã©ãããã©ãŒã ïŒ3ïŒããã±ãŒãžã«å«ãŸããŠããŸããLinuxãŠãŒã¶ãŒã¯ãªããžããªããghcãã€ã³ã¹ããŒã«ã§ããŸãã Prelude>ã§å§ãŸããµã³ãã«ã³ãŒãã¯ãã€ã³ã¿ã©ã¯ãã£ããªã€ã³ã¿ãŒããªã¿ãŒghciã§ãã§ãã¯ã§ããŸãã
ããã«ãåæ§ã®èšäºããããŸããïŒ4ïŒããI / Oã®ãã¹ãŠã®å ¥åºåã«ã€ããŠã¯èª¬æããŠããŸãããã䜿çšã§ããæ¢è£œã®ãã³ãã¬ãŒããæäŸããŠããŸãã
次ã®ã¹ãããã«é²ã-ãªãã¬ãŒã¿ãŒ
é ãããå§ããŸãããã Haskellã®ãã¹ãŠã®èšç®ã¯ããå¯äœçšããããšãå¯äœçšãªããã«åããããŸããã æåã®äŸã«ã¯ãããšãã°ãå ¥å/åºåããã€ã¹ããã®æžã蟌ã¿/èªã¿åããéäžã§ãšã©ãŒãçºçããå¯èœæ§ãããèšç®ãªã©ãå«ãŸããŸãã ãå¯äœçšãªããã«ã¯ãæ°å€ã®è¿œå ãæååã®æ¥çãæ°åŠçèšç®ããçŽç²ãªãé¢æ°ãªã©ã®æäœãå«ãŸããŸãã
çŽç²ãªé¢æ°ã¯ãä»ã®ãã¹ãŠã®ããã°ã©ãã³ã°èšèªã®é¢æ°ãçµåããã®ãšåãæ¹æ³ã§çµåããŸãã
Prelude> show (head (show ((1 + 1) -2))) '0'
å¯äœçšã®ããããã°ã©ã ãäœæããããã«ãç¹å¥ãªæŒç®åãäœæãããŸãã
>>=
ããããæ¥ç¶ãïŒengãbindïŒãšåŒã³ãŸãããã ãã¹ãŠã®I / Oã¢ã¯ã·ã§ã³ã¯ãããã«æ¥çãããŠããŸãã
Prelude> getLine >>= putStrLn asdf asdf
ãã®æŒç®åã¯ãå¯äœçšã®ãã2ã€ã®é¢æ°ãå ¥åãšããŠåãå ¥ããå·Šã®é¢æ°ã®åºåã¯å³ãžã®å ¥åãšããŠæ©èœããŸãã
ã€ã³ã¿ããªã¿ã³ãã³ãã§é¢æ°ã®ã¿ã€ããèŠãŠã¿ãŸãããïŒtïŒ
Prelude> :t getLine getLine :: IO String Prelude> :t putStrLn putStrLn :: String -> IO ()
ãã®ãããgetLineã¯äœãåãå ¥ãããIO Stringåãè¿ããŸãã
ã¿ã€ãåã«2ã€ã®åèªãå«ãŸããŠãããšããäºå®ã¯ããã®ã¿ã€ããè€åã§ããããšã瀺ããŠããŸãã ãããŠãæåã«æ¥ãèšèã¯ãã¿ã€ããã«ããŒãšåŒã°ããŸããä»ã®ãã¹ãŠã¯ãã®ãã«ããŒã®ãã©ã¡ãŒã¿ãŒã§ãïŒäžååé³ãèãããã®ã¯ç¥ã£ãŠããŸããããããã¹ãã§ãïŒã
ãã®å ŽåãIOãšããåèªã¯åãªãå¯äœçšãæå³ããæŒç®å=ã«ãã£ãŠç Žæ£ãããŸãã å¯äœçšã®ä»ã®ãææšãã®äŸãšããŠã人æ°ã®ããã¿ã€ãStateãæããããšãã§ããŸããããã¯ãé¢æ°ãäœããã®çš®é¡ã®ã¹ããŒããæã€ããšãæå³ããŸãã
putStrLnã«é²ã¿ãŸãããã ãã®é¢æ°ã¯æååãå ¥åãšããŠåãåããIOïŒïŒãè¿ããŸãã IOã䜿çšãããšããã¹ãŠãæ確ã«ãªããå¯äœçšããããïŒïŒã¯Hassalã®syssal voidã®é¡äŒŒç©ã§ãã ã€ãŸã é¢æ°ã¯å ¥å/åºåã§äœããè¡ãã空ã®å€ãè¿ããŸãã ãšããã§ããã¹ãŠã®Haskellããã°ã©ã ã¯ãã®IOïŒïŒã§çµäºããå¿ èŠããããŸãã
ãã®ããããæ¥ç¶ãæŒç®åã¯ãæåã®åŒæ°ããçµæãååŸããå¯äœçšã€ã³ãžã±ãŒã¿ãåãåãã2çªç®ã®åŒæ°ã§çºçããããšãæž¡ããŸãã ããã¯è€éã«æããŸãããHaskellã®ååã¯ãã®åäžã®ã¹ããŒãã¡ã³ãã§ãµããŒãããããã¹ãŠã®å ¥å/åºåã¯ããã䜿çšããŠããã°ã©ã ãããŸãã ããã¯éåžžã«éèŠã§ãããèšèªã®ããŽã«è¿œå ãããã»ã©ã§ãã
æ¥çãããé¢æ°ã®è¿ãããå€ãšåãå ¥ããããå€ãäžèŽããªãå Žåã¯ã©ããªããŸããïŒ ã©ã ãé¢æ°ãå©ãã«ãªããŸãã ããšãã°ãå ¥åãšããŠãã©ã¡ãŒã¿ãŒãåãå ¥ããã ãã§ãããäœãè¡ããŸããã
Prelude> (putStrLn " 1") >>= (\a -> putStrLn " 2") >>= (\b -> putStrLn " 3") 1 2 3
ä»åŸãã=ãæŒç®åã®åªå 床ã¯éåžžã«äœããå¿ èŠã«å¿ããŠããã®äŸã§ã¯æ¬åŒ§ãªãã§å®è¡ã§ããŸãã ããã«ããã®äŸã®ããã«ãåŒæ°ãã©ã ãé¢æ°å ã§äœ¿çšãããŠããªãå Žåã¯ã_ã§çœ®ãæããããšãã§ããŸãã
æåã®äŸãå®å šã«åçã«æžãæããŸãããã©ã ãé¢æ°ã䜿çšããŸãã
Prelude> getLine >>= \a -> putStrLn a asdf asdf
ã©ã ãé¢æ°ã䜿çšããŠç»é¢ã«æååã衚瀺ãããšãã1ã€ã®å€æ°ãåãå ¥ããããšãæ瀺çã«ç€ºãããã®äœ¿çšæ¹æ³ãæ瀺çã«èšè¿°ããŸããã
ãå€æ°ããšèšããŸãããïŒ
ã¯ããå€æ°ã«ã€ããŠè©±ããŸãããã ãåãã®ããã«ãHaskellã«ã¯å€æ°ã¯ãããŸããã ãã ãããªã¹ããèŠããšãå€ãã®å²ãåœãŠã衚瀺ãããŸãã
äžèšã®ã³ãŒãã§ã¯ãaãšbã¯å€æ°ã«éåžžã«äŒŒãŠããŸãã ä»ã®èšèªãšåæ§ã«åç §ããããšãã§ããŸãã ãã ãããããã®aãšbã¯ãåœä»€åèšèªã®å€æ°ãšã¯å€§ããç°ãªããŸãã
ãã¹ãŠã®åœä»€åããã°ã©ãã³ã°èšèªã§ã¯ãå€æ°ã¯ååä»ãã®ã¡ã¢ãªé åã§ãã Haskellã§ã¯ãaãbã®ãããªãã®ã¯ååä»ãã®åŒãšå€ã§ãã
äŸãæããŠããããã®éãã瀺ããŸãã 次ã®Cã³ãŒããæ€èšããŠãã ããã
a = 1; a = a + 1; printf("%d",a)
ãã¹ãŠãéæã§ãçµæã¯äºæž¬å¯èœã§ãã
Haskellã§ãåãããšãè¡ããŸãã
Prelude> let a = 1 Prelude> let a = a + 1 Prelude> print a ^CInterrupted.
ã³ãŒãã®å®è¡ã¯çµãããŸããã 1è¡ç®ã§ã¯ãaã1ãšããŠå®çŸ©ããŸãã2è¡ç®ã§ã¯ãa + 1ãšããŠå®çŸ©ããŸãã2è¡ç®ãèªã¿åããšããã€ã³ã¿ãŒããªã¿ãŒã¯aã®åã®å€ãå¿ãããã®å Žåãaèªäœãå床決å®ããŸãã ããŠããã®ååž°çãªå®çŸ©ã¯æ±ºããŠèšç®ãããŸããã
èšæ¶ã®æå®ãããé åã«é¢ããŠã¯-Haskellã«ãããŸãããããã¯ãŸã£ããç°ãªã話ã§ãã
ãã®èšèšã䜿çšãããšããconnectãæŒç®åã®ããã€ãã®åŒã³åºããéããŠãã©ã¡ãŒã¿ãŒãæž¡ãããšãã§ããŸãã
Prelude> getLine >>= \a -> putStrLn " :" >>= \_ -> putStrLn a asdf : asdf
å®éã®ã³ãŒã
ããã§ãç§å¯ã®ç¥èã䜿çšããŠãçŸå®ã®ãã®ãæžããŸãã ã€ãŸãããŠãŒã¶ãŒããããŒã¿ãåä¿¡ããããã°ã©ã ã¯ããŠãŒã¶ãŒã«å¯ŸããŠäœããã®ã¢ã¯ã·ã§ã³ãå®è¡ããçµæãç»é¢ã«è¡šç€ºããŸãã ããã°ã©ã ãå¥ã®ãã¡ã€ã«ã«æžã蟌ã¿ããã·ã³ã³ãŒãã«ã³ã³ãã€ã«ããŸãã
ãã¡ã€ã«ã«test.hsãšããååãä»ããŸãã
main = putStrLn " :" >>= \_ -> getLine >>= \a -> putStrLn " :" >>= \_ -> putStrLn (show ((read a)^2))
ã³ã³ãã€ã«ïŒ
ghc --make test.hs
å®è¡ïŒ
$ ./test : 12 : 144
readé¢æ°ã¯ãæååãç®çã®åã®å€ã«è§£æããããšããŸãã 圌女ãæšæž¬ããã¿ã€ãã¯å¥ã®è©±ã§ãã showé¢æ°ã¯ãä»»æã®ã¿ã€ãã®å€ãæååã«å€æããŸãã
èªã¿åãé¢æ°ã¯å®å šã§ã¯ãããŸãã;æåãäžããŠæ°åã®è§£æãèŠæ±ãããšããšã©ãŒãçºçããŸãã ããã«ãã ããã€ããã¯ãããŸããããã®ã±ãŒã¹ã«ã¯å®å šãªã¢ãžã¥ãŒã«ãããããšã ãã«èšåããŸãã
çŽåºŠã®æ··åç©
ãããšã¯å¥ã«ãå¯äœçšã³ãŒãããçŽç²ãªé¢æ°ãåŒã³åºãæ¹æ³ã«ã€ããŠã®çåãçããŸãã
äžèšã®äŸã§ã¯ãçŽç²ãªé¢æ°ã¯åã«IOé¢æ°ã®åŒæ°ãšããŠèšè¿°ãããŠããŸãã å€ãã®å Žåãããã§ååã§ãããåžžã«ã§ã¯ãããŸããã
ã¯ãªãŒã³ã³ãŒããåŒã³åºãæ¹æ³ã¯ä»ã«ããããŸãã
ãããã®æåã®ãã®ã¯ãã¯ãªãŒã³ãªã³ãŒãããå¯äœçšã³ãŒããžã®æŽåçãªå€æã§ãã å®éãçŽç²ãªã³ãŒãã¯å¯äœçšã®ç¹æ®ãªã±ãŒã¹ãšèŠãªãããšãã§ããããããã®å€æã¯å±éºããããããŸããã ãããŠãreturné¢æ°ã䜿çšããŠå®è£ ãããŸãïŒ
main = putStrLn " :" >>= \_ -> getLine >>= \a -> putStrLn " :" >>= \_ -> return (show ((read a)^2)) >>= \b -> putStrLn b
ã³ã³ãã€ã«ãæ€èšŒãããã°ã©ã ã¯ä»¥åãšåãããã«æ©èœããŸãã
ãã1ã€ã®æ¹æ³ã¯ãlet ... in ... Haskelã³ã³ã¹ãã©ã¯ãã䜿çšããããšã§ããå€ãã®ããã¥ã¢ã«ã§ã¯ãååãªæ³šæãæãããŠããã®ã§ãæ¢ããŸãããæ¢è£œã®äŸãæããŸãã
main = putStrLn " :" >>= \_ -> getLine >>= \a -> putStrLn " :" >>= \_ -> let b = (show ((read a)^2)) in putStrLn b
ãã£ãšç ç³ãå¿ èŠ
èšèªéçºè ã¯ãæ§é ãäžè¬çã§ããããšãèªèããŠããŸã
>>= \_ ->
ãããã£ãŠããããã瀺ãããã«ãæŒç®åãå°å ¥ããŸãã
>>
ã³ãŒããæžãæããŸãïŒ
main = putStrLn " :" >> getLine >>= \a -> putStrLn " :" >> let b = (show ((read a)^2)) in putStrLn b
ããã§ããå°ããããã«ãªããŸããã
ãããããã£ãšã¯ãŒã«ãªããªãã¯ããããŸã-æ§æç³ã¯ãããã ïŒ
main = do putStrLn " :" a <- getLine putStrLn " :" let b = (show ((read a)^2)) putStrLn b
å¿ èŠãªãã®ïŒ ã ããããã§ã«çããããšãã§ããŸãã
å·Šæãã«éå®ãããdoãããã¯å ã§ã¯ã次ã®çœ®æãè¡ãããŸãã
a <- abc abc >>= \a -> abc abc >> let a = b let a = b in do
ãdoãè¡šèšã«ãããæ§æã¯ææ°ã®ãã¹ãŠã®ããã°ã©ãã³ã°èšèªã®æ§æãšéåžžã«ãã䌌ãŠããŸãã ããã«ãããããããå éšã§ã¯ãã¯ãªãŒã³ãªã³ãŒããšå¯äœçšã³ãŒããåé¢ããããã®ããèããããã¡ã«ããºã ããããŸãã
èå³æ·±ãéãã¯ãreturnã¹ããŒãã¡ã³ãã®äœ¿çšã§ãã ãããã¯ã®äžå€®ã«æ¿å ¥ã§ããé¢æ°ã®å®è¡ãäžæãããæ··ä¹±ãæãå¯èœæ§ããããŸãã ãããå®éã«ã¯ããããã¯ã®æåŸã§IOé¢æ°ããçŽç²ãªå€ãè¿ãããã«ãã䜿çšãããŸãã
get2LinesAndConcat:: IO String get2LinesAndConcat = do a <- getLine b <- getLine return (a + b)
ç空äžã®ç
次ã«ãå¥ã®é¢æ°ã§ã¯ãªãŒã³ãªã³ãŒããåãåºããŸãã åæã«ãæåŸã«äžè¶³ããŠããã¿ã€ã眲åãæŽçããŸãããã
main :: IO () main = do putStrLn " :" a <- getLine putStrLn " :" let b = processValue (read a) putStrLn (show b) processValue :: Integer -> Integer processValue a = a ^ 2
éèŠãªç¹ã¯ãå¯äœçšã®I / Oã³ãŒãã¯I / Oã³ãŒãããã®ã¿å®è¡ã§ããããšã§ãã ãã ããã¯ãªãŒã³ã³ãŒãã¯ã©ãããã§ãå®è¡ã§ããŸãã
ãããã£ãŠãçŽç²ãªæ©èœçäžçã¯ãå¯äœçšã«é¢é£ãããã¹ãŠã®ãã®ããå³å¯ãã€ç¢ºå®ã«åé¢ãããŸãã processValueã®å éšã§ã¯ããããããã®ãæ€èšããããããããžãã¯ãå®è£ ã§ããŸãã ãããã100äžè¡ã®ã³ãŒãã®ããžãã¯ãããããåŒã³åºããããšããŠããã©ã®å ¥åå€ã«å¯ŸããŠããåºåã¯åžžã«åãã§ãããšç¢ºä¿¡ã§ããŸãã ãããŠãããã«æž¡ããããã©ã¡ãŒã¿ãŒã¯æ±ºããŠæãªãããããšã¯ãªãã®ã§ãããã«å®å šã«äœ¿çšã§ããŸãã
ã¹ã¿ã€ã«ã¬ã€ãã§ã¯ãå¯äœçšã³ãŒãã®äœ¿çšãæå°éã«æããçŽç²ãªæ©èœã«æ倧éã®æ©èœãããããããšããå§ãããŸãïŒ5ïŒã ãã ããããã°ã©ã ãI / Oãå®è¡ããããã«èšèšãããŠããå Žåã¯ãå¿ èŠãªå Žæã§äœ¿çšããããšãé¿ããªãã§ãã ããã ååãšããŠããã®ãããªå Žåãè£å©æ©èœãå¿ èŠã§ãããããã¯çŽç²ãªå ŽåããããŸãã çµéšè±å¯ãªHaskellããã°ã©ããŒã¯ãåœä»€åèšèªãšæ¯èŒããŠIOã³ãŒãã®åªãããµããŒãæ§ãèªèããŠããŸãïŒãã®ã¹ããŒãã¡ã³ãã¯Simon Peyton Johnesã«ãããã®ã§ãããçŽæ¥ãªã³ã¯ã¯èŠã€ãããŸããã§ããïŒã
çŽç²ãªé¢æ°ã«ã¯ãããã©ãŒãã³ã¹ã®1ã€ã®åŽé¢ããããŸãã å€å žçãªäŸãèŠãŠã¿ãŸããããå€ãã®ãã£ãŒã«ããæã€è€éãªãåŸæ¥å¡ãæ§é ãé¢æ°ã«æž¡ããŸãã ãã®ãããsiãšã®é¡æšã«ãããã³ãŒãã®å¹çã¯ãã€ã³ã¿ãŒã§ãã®ãã©ã¡ãŒã¿ãŒãæž¡ãããšã«å¹æµããsiã§ã¯ã¹ã¿ãã¯ãééããã ãã§å ã®æ§é ã®èæ§ãä¿èšŒããããããä¿¡é Œæ§ã¯ãã©ã¡ãŒã¿ãŒãã¹ã¿ãã¯ã«æž¡ãããšã«å¹æµããŸãã
äœèšã£ãŠãã®ïŒ
ããã®ã³ãŒãã¯ã²ã©ããäžåçã«è€éã§ãä»ã®ãã¹ãŠã®èšèªã®ãŠã©ãŒã ãã¥ãŒãã»ãã³ãã£ã¯ã¹ãšã®å ±éç¹ãå°ãªãããŸããc/ c ++ / cïŒ/ java / pythonãªã©ã§ååã§ããã
ãŸããããã«ã¯ããã€ãã®çå®ããããŸãã ããã§ãããªããæããããšæãããšã決å®ããå¿ èŠããããŸãïŒããããªã³ãŒããŸãã¯ãã®ã¡ã«ããºã ã®ç¹å®ã®å®è£ ããå¯äœçšãåé¢ããŸãã
ãã®ãããªã¡ã«ããºã ãããã·ã³ãã«ã§ç解ãããããã®ã«ããæ¹æ³ãç¥ã£ãŠãããªãããããäžçã®ã³ãã¥ããã£ã«äŒããŠãã ããïŒ Haskellã³ãã¥ããã£ã¯éåžžã«ãªãŒãã³ã§ãã¬ã³ããªãŒã§ãã å®æçã«æ¡çšãããŠããæ°ããæšæºã®ãã©ããã§ã¯ãããããææ¡ãèæ ®ãããŠãããæ¬åœã«äŸ¡å€ãããå Žåã¯ã確å®ã«åãå ¥ããããŸãã
ãPythonã§ããã¹ãŠãè¯ããããªãã¯å¯äœçšã«å·çããŠããïŒããšæããªãã誰ãããªãã奜ããªããŒã«ã䜿ãããšãæ°ã«ããŸããã ç§ããã¯ãHaskellãéçºãæ¬åœã«åçŽåããã³ãŒããããç解ããããããããšãä»ãå ããããšãã§ããŸãã ãããŸãã¯ãã®éã確èªããå¯äžã®æ¹æ³ã¯ãHaskellã§æžãããšã§ãïŒ
次ã«è¡ãå Žæ
ãããªãç 究ã®ããã
ããã«ããã¡ãããä»ã®èšäºãé©ããŠããŸãïŒ8ïŒã å€ãã®ã¬ã€ããæžãããŠããŸããããããã¯ãã¹ãŠç°ãªã芳ç¹ããåãããšã説æããŠããŸãã æ®å¿µãªããããã·ã¢èªã«ç¿»èš³ãããæ å ±ã¯ã»ãšãã©ãããŸããã è±å¯ãªããã¥ã¢ã«ãããã«ãããããããèšèªã¯åçŽã§ããããã®èª¬æãšæšæºã©ã€ãã©ãªã®èª¬æã¯270ããŒãžããå¿ èŠãããŸããïŒ9ïŒã
ããªãå€ãã®æ å ±ãæšæºã©ã€ãã©ãªã®ããã¥ã¡ã³ãã«å«ãŸããŠããŸãïŒ10ïŒã
ãã®èšäºã誰ããå©ããããåã«é¢çœããã ãšæã£ãããã³ã¡ã³ããæ¹å€ãæè¿ããŸãã
ps Haskellã®äžçã§ãã¿ã€ããã«ããŒããšåŒãã ãã®ã¯ãã ã¿ã€ãã³ã³ã¹ãã©ã¯ã¿ãŒ ããšåŒã°ããŸãã ããã¯ãOOPããåãããããã¶ã€ããŒããšããèšèã®æå³ãå¿ããããããããã«è¡ãããŸãããããã¯å®å šã«ç°ãªããã®ã§ãã ãã®ç¶æ³ã¯ãåã³ã³ã¹ãã©ã¯ã¿ãŒã«å ããŠãOOPãšã¯é¢ä¿ã®ãªãããŒã¿ã³ã³ã¹ãã©ã¯ã¿ãŒããããšããäºå®ã«ãã£ãŠæªåããŸãã
åç §è³æ
- www.haskell.org/haskellwiki/Monad_tutorials_timeline
- http://en.wikipedia.org/wiki/Monad_(category_theoryïŒ
- hackage.haskell.org/platform
- habrahabr.ru/blogs/Haskell/80396
- www.haskell.org/haskellwiki/Avoiding_IO
- www.haskell.org/tutorial
- www.rsdn.ru/article/haskell/haskell_part1.xml
- www.haskell.org/haskellwiki/Tutorials
- www.haskell.org/definition/haskell98-report.pdf
- www.haskell.org/ghc/docs/7.0.3/html/libraries
updïŒïŒãã¿ãã¬ïŒïŒ
ã³ã¡ã³ãã§æ£ããä¿ãããã®ã§ãã¢ããã®ããã¥ã¢ã«ã®ååã®éžæã¯å®å šã«æåããŠããŸããã ã¢ããã®ãããã¯ã¯å ¬éãããŠããªããããæ§ãããªå°è±¡ãæ®ã£ãŠããŸãã
ãã®ããããã¢ããããšããèšèã¯äžé£ã®æŒç®åã§ã
>>= >> return fail
ãããŠãããããå®çŸ©ãããŠããããããã¿ã€ãã®ããŒã¿ã ããšãã°ãIOã
ãã®èšèã®åšãã§ã¯ãããŸãè¯ããªãŒã©ã¯çºéããŠããŸããããå®éã«ã¯ç§å¯ã®æå³ã¯ãããŸããã ããã¯ã ã¢ãããªãã§èª¬æã§ããããã°ã©ãã³ã°ãã¿ãŒã³ã®ååã§ãã
upd2ïŒ
Afiskonã¯èå³æ·±ããã¬ãŒã³ããŒã·ã§ã³ãžã®ãªã³ã¯ãæäŸããŸãã
Haskellã«ã€ã㊠ã