åå ãã代ããã«ïŒç¿»èš³éå§ïŒïŒ
å€ãã®ãã¢ããã®çŽ¹ä»ãã§ã¯ãã¢ããã¯èª¬æãé£ãããã®ãšããŠæ瀺ãããŸãã ããã¯å®éã«ã¯è€éãªãã®ã§ã¯ãªãããšã瀺ããããšæããŸãã å®éãé¢æ°åããã°ã©ãã³ã°ã®ããŸããŸãªåé¡ã«çŽé¢ãããšãå€ãã®å Žåã¢ããã®äŸã§ããããŸããŸãªè§£æ±ºçã«æåºãšããŠåºããããŸãã ãããŠããŸã åŠãã§ããªããªããããããçºæããããšãåŠã¶ããšãé¡ã£ãŠããŸãã ä»åŸã¯ããããã®ãœãªã¥ãŒã·ã§ã³ã¯æ¬è³ªçã«åããœãªã¥ãŒã·ã§ã³ã§ãããšèšããŸãã èªãã åŸãããªãã¯ããããããªããèªåãçºæãããã®ãšããŠèŠããã®ãã¹ãŠãèªèããã®ã§ãããããã¢ããã®ä»ã®äœåãããããç解ããã§ãããã
ã¢ããã解決ããããšããŠããå€ãã®åé¡ã¯ããå¯äœçšãã®åé¡ã«é¢é£ããŠããŸãã ãããŠããããããå§ããŸãã ïŒç§ã¯ã¢ãããå¯äœçšãæ±ãèœåãããã¯ããã«å€ãã®ããšãå¯èœã«ããŠããããšã«æ³šæããŠãã ãããç¹ã«ã³ã³ãããªããžã§ã¯ãã®å€ãã¯ã¢ãããšããŠè¡šçŸã§ããŸãã
å¯äœçšïŒçŽç²ãªæ©èœã®ãããã°
C ++ãªã©ã®åœä»€åããã°ã©ãã³ã°èšèªã§ã¯ãé¢æ°ã¯æ°åŠçãªæå³ã§é¢æ°ãšã¯ç°ãªãåäœãããŸãã ããšãã°ãC ++é¢æ°ã1ã€ã®åŒæ°ãæµ®åå°æ°ç¹æ°ãåãåããæµ®åå°æ°ç¹æ°ãè¿ããšããŸãã
å€èŠäžã¯ãRããRãžã®æ°åŠé¢æ°ã®ããã«èŠããŸãããC ++é¢æ°ã¯ãåŒæ°ã«äŸåããåãªãæ°å€ãè¿ã以äžã®ããšãã§ããŸãã ã°ããŒãã«ã¡ã¢ãªããå€ãèªã¿æžãããããç»é¢ã«åºåãæžã蟌ãã ãããŠãŒã¶ãŒããå ¥åãåãåã£ããã§ããŸãã çŽç²ãªé¢æ°åèšèªã§ã¯ãé¢æ°ã¯åŒæ°ãä»ããŠæž¡ããããã®ã®ã¿ãèªã¿åãããšãã§ããå€éšã®äžçã«åœ±é¿ãäžããæ¹æ³ã¯1ã€ãããããŸãã-çºè¡ãããå€ã§ãã
ãããã£ãŠãçŽç²ãªããã°ã©ãã³ã°èšèªã§ã®æ¬¡ã®åé¡ãèããŠã¿ãŸããããé¢æ°fãšgãR-> RãšããŠæ©èœãããããã®é¢æ°ãå€æŽããŠãããã°æ å ±ãåºåããããã«ããŸãã Haskellã§ã¯ãfãšgã¯æ¬¡ã®ã¿ã€ããæã€ããšãã§ããŸã
f,g :: Float -> Float
å¯äœçšã蚱容ããããã«ãã¿ã€ãfãšgãã©ã®ããã«å€æŽã§ããŸããïŒ å®éãéžæã®äœå°ã¯ãããŸããã fãšgã§æååãšæµ®åå°æ°ç¹æ°ãäœæããå Žåãå¯äžå¯èœãªæ¹æ³ã¯ãæµ®åå°æ°ç¹æ°ãšãšãã«æååãè¿ãããšã§ãã èšãæããã°ãé¢æ°f 'ãšg'ã¯åãæããªããã°ãªããŸãã
f',g' :: Float -> (Float,String)
ãããå³ã«æãããšãã§ããŸãã
x | + --- + | f '| + --- + | \ | | fx "fãåŒã³åºãããŸããã"
ããããããããã°é¢æ°ããšåŒã³ãŸãã
ãã®ãããª2ã€ã®é¢æ°ã®æ§æããããã°ãããšããŸãã åæé¢æ°fãšgã®åçŽãªæ§æãfã®åœ¢åŒã§èšè¿°ã§ããŸãã g ã ãã ãããããã°æ©èœã®å ŽåããããçŽæ¥è¡ãããšã¯ã§ããŸããã f 'ãšg'ã«ãã£ãŠè¿ãããè¡ããå ±éã®ãããã°è¡ïŒ g 'ãã1ã€ãããã³f'ãã1ã€åŸã®è¡ïŒã«çµåããå¿ èŠãããããã§ãã ãã ãã g 'ã®æ»ãå€ã®åãf'ã®åŒæ°ã®åãšäžèŽããªãããã f 'ãšg'ãçŽæ¥çµåããããšã¯ã§ããŸããã ãœãªã¥ãŒã·ã§ã³ã³ãŒãã¯æ¬¡ã®ããã«èšè¿°ã§ããŸãã
let (y,s) = g' x
(z,t) = f' y in (z,s++t)
ãããå³ã§ç€ºããŸã
x | + --- + | g '| + --- + | \ + --- + | ãgãåŒã°ãããã | f '| | + --- + | | \ | | | \ | | | + ---- + | | ++ | | + ---- + | | fïŒgxïŒãgãåŒã³åºãããŸãããfãåŒã³åºãããŸãããã
æ¯åããã®æ¹æ³ã§2ã€ã®é¢æ°ã®æ§æãèšè¿°ããããšã¯é£ãããã³ãŒãã®ã©ãã«ã§ããã®ãããªãã€ã³ãã£ã³ã°ãèšè¿°ãããå Žåãããã¯é£ããã¿ã¹ã¯ã«ãªããŸãã å¿ èŠãªã®ã¯ããã®ãã€ã³ãã£ã³ã°ãå®è¡ããããã«é«éé¢æ°ãå®çŸ©ããããšã§ãã é£ç¹ã¯ãåºåg 'ãå ¥åf'ã«äŸçµŠã§ããã f 'ããæ¹åãããå¿ èŠãããããšã§ãã ãããè¡ãã«ã¯ã次ã®ã¿ã€ãã®é¢æ°ãå°å ¥ãã bindãšåŒã¶å¿ èŠããããŸã
bind f' :: (Float,String) -> (Float,String)
ãã®ããã«åäœããŸã
bind :: (Float -> (Float,String)) -> ((Float,String) -> (Float,String))
bindã¯2ã€ã®ã¿ã¹ã¯ãå®è¡ããå¿ èŠããããŸããïŒ1ïŒç®çã®éšåg 'xã« f'ãé©çšããïŒ2ïŒ g 'ã«ãã£ãŠè¿ãããæååãšf'ã«ãã£ãŠè¿ãããæååãçµåããå¿ èŠããããŸãã
æŒç¿1
ãã€ã³ãé¢æ°ãäœæããŸãã
解決ç
bind f' (gx,gs) = let (fx,fs) = f' gx in (fx,gs++fs)
ããã§ããããã°é¢æ°f 'ãšg'ã®æ§æãèšè¿°ã§ããŸãã ãããã®çµæãf '°g'ãšããŠç€ºããŸãã gã®åºåãã fã®å ¥åãšäºææ§ããªãããšããäºå®ã«ããããããããããã®æäœãçµã¿åãããç°¡åãªæ¹æ³ããããŸãã ãããŠãããã¯æ¬¡ã®è³ªåã«ã€ãªãããŸãïŒãåäžã®ãæ©èœã®ååšã éåžžã1ïŒæçå€æïŒã«ã¯æ¬¡ã®ããããã£fÃ1 = fããã³1Ãf = fããããŸãã unit°f = f°unit = fã®ãããªãããã°é¢æ°ïŒãŠããããåŒã³åºããŸãããïŒãèŠã€ããããšãã§ããŸãã æããã«ã空ã®ãããã°æ å ±ã衚瀺ããé¢æ°ãäœæã§ããŸããããã§ãªãå Žåã¯ãåäžã®å€æãšããŠæ©èœããŸãã
æŒç¿2
unitãå ¥åããŸãã
解決ç
unit x = (x,"")
ãŠãããé¢æ°ã䜿çšãããšãé¢æ°ããããã°ã¹ããŒã¹ã«ãæã¡äžãããããšãã§ããŸãã å®éã«ã¯ïŒ
lift fx = (fx,"")
ãŸãã¯ç°¡åã«ãªããf =åäœã f ãraisedãé¢æ°ã¯å ã®é¢æ°ãšåãããã«æ©èœããè«ççã«ã¯å¯äœçšãšããŠç©ºã®æååã衚瀺ããŸãã
æŒç¿3
ãªããf°ãªããg =ãªããïŒfãgïŒã§ããããšã瀺ã
èŠçŽãããšã ãã€ã³ãé¢æ°ãšãŠãããé¢æ°ã䜿çšãããšããããã°é¢æ°ãçŽæ¥äœæããéåžžã®é¢æ°ãšãããã°ãèªç¶ãªæ¹æ³ã§çµã¿åãããããšãã§ããŸãã
ä¿¡ããããªããããããŸããããç·Žç¿ãçµããŠæåã®ã¢ãããç¹å®ããŸããã ä»ãããããã©ã®æ§é ãã¢ããã§ãããããŸãã¯ä»ã®ã¢ãããã©ã®ããã«èŠãããã¯ããŸãæ確ã§ã¯ãããŸããã ããããããã§ã¢ãããå®çŸ©ãã代ããã«ãä»ã®ããç°¡åãªæŒç¿ã䜿çšããŠããã®ååã«å€ããäžè¬çãªæ§é ãèªåã§ç解ã§ããããã«ä»ã®ã¢ããããããããŸãã ãŸãããã®åé¡ã«ééããã»ãšãã©ã®äººã¯ã ãã€ã³ãæ©èœãæšæž¬ããŠãããã°æ©èœãçµã¿åãããããšãã§ãããšç¢ºä¿¡ããŠããŸãã ãŸããã¢ããã§ããããšã«æ°ä»ããŠããªããŠãããã§ã«ã¢ãããæãä»ãããšãã§ãããšç¢ºä¿¡ããŠããŸãã
ã³ã³ããïŒå€å€é¢æ°
ããããå®æ°ã®å¹³æ¹æ ¹ãšç«æ¹æ ¹ãèšç®ããé¢æ°sqrtãšcbrtãèããŠãã ããã ãããã®é¢æ°ã¯ãFloatããFloatã«äœçšããŸãïŒ sqrtã¯è² ã®åŒæ°ã«å¯ŸããŠãäŸå€ãã¹ããŒããå¿ èŠããããŸãïŒã
次ã«ããããã®é¢æ°ã®è€éãªããŒãžã§ã³ãäœæããŸãã ãŒããé€ããã¹ãŠã®è€çŽ æ°ã«ã€ããŠã2ã€ã®å¹³æ¹æ ¹ãå¿ èŠã§ãã åæ§ã«ããŒã以å€ã®ãã¹ãŠã®è€çŽ æ°ã«ã¯3ã€ã®ç«æ¹æ ¹ããããŸãã ãããã£ãŠãé¢æ°sqrt 'ããã³cbrt'ãå®çŸ©ããŠãæ°å€ã®ãªã¹ããè¿ããŸãã
sqrt',cbrt' :: Complex Float -> [Complex Float]
ããããå€å€é¢æ°ãšåŒã³ãŸãã
å®æ°ã®6çªç®ã®æ ¹ãèŠã€ããããšããŸãããã®å Žåãå¹³æ¹æ ¹ãšç«æ¹æ ¹ãåçŽã«çµã¿åãããããšãã§ããŸãã ã€ãŸãã6çªç®ã®ã«ãŒããx = sqrtïŒcbrt xïŒãšããŠå®çŸ©ã§ããŸãã
sqrt 'ããã³cbrt'ã䜿çšããŠãè€çŽ æ°ã®6ä¹ã®6ã€ã®æ ¹ããã¹ãŠè¿ãé¢æ°ãèããŸãã ãããã®é¢æ°ã®åéåã ããæžãçããããšã¯ã§ããŸããã æåã«æ°å€ã®3ä¹æ ¹ãèšç®ãã次ã«ååŸããå€ã®å¹³æ¹æ ¹ãèšç®ãããã¹ãŠã®çµæã1ã€ã®é·ããªã¹ãã«çµåããå¿ èŠããããŸãã ãããè¡ãã«ã¯ãå®çŸ©ã䜿çšããŠé¢æ°ãäœæããå¿ èŠããããŸãïŒ bindãåŒã³åºããŸãããïŒ
bind :: (Complex Double -> [Complex Double]) -> ([Complex Double] -> [Complex Double])
å®å šãªããã»ã¹ã説æããå³ã次ã«ç€ºããŸãã cbrtã 1åæžãããããçµæã®å€ã«sqrtãé©çšãããã
64 | + ------ + + sqrt '+ + ------ + +8 / \ -8 + ------ + + ------ + | cbrt '| | cbrt '| + ------ + + ------ + | | | | | | 2ã ã -2ã ã
æŒç¿4
ãã€ã³ãå®è£ ãäœæããŸãã
解決ç
bind fx = concat (map fx)
å€å€é¢æ°ã®ãŠããããäœæããã«ã¯ã©ãããã°ããã§ããïŒ ãŠãããã¯1ã€ã®åŒæ°ãè¿ããããé¢æ°ã®è€æ°å€ããŒãžã§ã³ã§ã¯ã1ã€ã®èŠçŽ ã§æ§æããããªã¹ããè¿ãå¿ èŠããããŸãã ãŠãããé¢æ°ãåŒã³åºããŸãã
ã¿ã¹ã¯5
ã¬ã³ãŒãåäœã
解決ç
unit x = [x]
ãŸãã f°g = bind fãå®çŸ©ããŸãã gããã³ãªããlift f = unitã f Raisingã¯æåŸ ããããšãè¡ããŸã-éåžžã®é¢æ°ãæ瀺çã«å€å€é¢æ°ã«å€æããŸãã
æŒç¿6
f°unit = unit°f = fããã³lift f°lift g = liftïŒfgïŒã§ããããšã瀺ã
ç¹°ãè¿ãã«ãªããŸãããäžèšã®åé¡ã«ããã容赊ãªããã€ã³ãæ©èœã«è³ããŸããã
æŒç¿ãå®äºããåŸã2çªç®ã®ã¢ãããäœæããŸããã ãããããããªãã¯ãã§ã«äžè¬çãªéçºãã¿ãŒã³ãç解ããŠããŸãã ããã2ã€ã®ç°ãªãå€èŠ³ã®åé¡ãå ±éã®èšèšã«ã€ãªããããšã¯å¥åŠã§ãã
ããè€éãªå¯äœçšã®äŸïŒä¹±æ°
Haskellä¹±æ°ã¯æ¬¡ã®ãšããã§ã
ã©ã³ãã :: StdGenâïŒaãStdGenïŒ
ããã¯ãä¹±æ°ãçæããããã«ç²åºŠãå¿ èŠã§ãããçæåŸã«æŽæ°ããå¿ èŠããããšããèãæ¹ã§ãã éçŽç²ãªèšèªã§ã¯ãã«ãŒãã«ãã°ããŒãã«å€æ°ã«ããããšãã§ãããŠãŒã¶ãŒã¯ãããçŽæ¥æäœããå¿ èŠããããŸããã ãã ããçŽç²ãªèšèªã§ã¯ãã°ã¬ã€ã³ãæ瀺çã«éåä¿¡ããå¿ èŠããããŸãïŒããã¯ãã©ã³ãã æ§ãè¡šããããã眲åã§ãïŒã ãã®åé¡ã¯ããã¢ã䜿çšããŠè¿œå æ å ±ãè¿ããšããç¹ã§ãäžèšã®ãããã°ã®å ŽåãšäŒŒãŠããããšã«æ³šæããŠãã ããã ãããããã®åé¡ã§ã¯ãè¿œå æ å ±ãéä¿¡ããŸãã
ãããã£ãŠãã©ã³ãã é¢æ°a- > bã§ããé¢æ°ã¯ ãé¢æ°aâStdGetâïŒbãStdGenïŒãšããŠæžãæããããšãã§ããŸããããã§ã StdGenã¯ã·ãŒãã§ãã
ããã§ã2ã€ã®ã©ã³ãã é¢æ°fãšgã®æ§æãäœæããæ¹æ³ãç解ããå¿ èŠããããŸãã fã®ãå®éã®ãæ»ãå€ã¯ãæåã®åŒæ°gã«æž¡ãå¿ èŠããããŸãã äžæ¹ããã¢ã®2çªç®ã®èŠçŽ ã«ãã£ãŠfã«ãã£ãŠè¿ãããã°ã¬ã€ã³ãgã«è»¢éããå¿ èŠããããŸãã ãã®ããã«ããŠããã€ã³ãé¢æ°ã®ã¿ã€ããèšè¿°ã§ããŸãã
bind ::ïŒaâStdGenâïŒbãStdGenïŒïŒâïŒStdGenâïŒaãStdGenïŒïŒâïŒStdGenâïŒbãStdGenïŒïŒ
æŒç¿7
ãã€ã³ããå®è£ ãã
解決ç
bind fx seed = letïŒx 'ãseed'ïŒ= x seed in fx 'seed'
次ã«ããŠããããäœæããå¿ èŠããããŸãã 圌女ã¯ã¿ã€ãã§ãªããã°ãªããŸãã
ãŠããã:: aâïŒStdGenâïŒaãStdGenïŒïŒ
ç©ç©ã¯å€æŽããªãã§ãã ããã
æŒç¿8
ãŠããããå®è£ ããŸãã
解決ç
åäœxg =ïŒxãgïŒ
ãŸãã¯åã«
åäœ=ïŒãïŒ
ãŸããæäœf°g =ãã€ã³ãfgããã³ãªããlift f =ãŠããããå®çŸ©ã§ããŸãã fã Raisingã¯æ³å®ãããŠããããšãè¡ããŸã-éåžžã®é¢æ°ãã©ã³ãã é¢æ°ïŒã©ã³ãã åïŒã«å€æããã«ãŒãã«ãå€æŽããŸããã
æŒç¿9
f°unit = unit°f = fããã³lift f°lift g = liftïŒfgïŒã§ããããšã瀺ã
ã¢ãã
ããã§ã¯ãæåã«æ»ã£ãŠå šäœçãªæ§é ã«æ³šç®ããŠãã ããã
å®çŸ©ãã
ã¿ã€ãDebuggable a =ïŒaãStringïŒ ã¿ã€ãMultivalued a = [a] ã¿ã€ãRandomized a = StdGen->ïŒaãStdGenïŒ
å€æ°mã䜿çšããŠãDebuggableãMultivaluedããŸãã¯Randomizedãå®è£ ããŸãã ãããã®å Žåããåãåé¡ã«çŽé¢ããŠããŸãã -> mbé¢æ°ããããŸããããã®é¢æ°ãã¿ã€ãaã§ã¯ãªããªããžã§ã¯ãã¿ã€ãmaã«é©çšã§ããå¿ èŠããããŸãã ãããè¡ãã«ã¯ãã¿ã€ãïŒa-> mbïŒ->ïŒma-> mbïŒã®ãã€ã³ãã£ã³ã°é¢æ°ïŒ bindãšåŒã°ããïŒãå®çŸ©ããæçå€æãŠããã:: a-> maãå°å ¥ããŸãã ããã«ãèŠä»¶ãæºããå¿ èŠããããŸãïŒ f°unit = unit°f = fããã³lift f°lift g = liftïŒfgïŒ ãããã§ïŒ ° ïŒããã³liftã¯unitããã³bindã®èŠ³ç¹ããå®çŸ©ãããŸãã
ä»ãç§ã¯ã¢ãããšã¯äœããèšãããšãã§ããŸãã ãªããžã§ã¯ãã®ããªãã«ïŒmããŠãããããã€ã³ãïŒã¯ã¢ããã§ãããã¢ããã§ããããã«ã¯ãäžèšã§èšŒæããæ³åãæºãããªããã°ãªããŸããã ãããŠã3ã€ã®ã±ãŒã¹ãã¹ãŠãå ±éã®æ§é ã«ãã£ãŠçµåãããŠããããšã«æ°ä»ããŠããªããŠãã3ã€ã®ã±ãŒã¹ã®ããããã§ãã€ã³ãé¢æ°ãçºæã§ãããšæããŸãã
ããã§ãç§ã¯ãããHaskellã¢ããã®å®çŸ©ã«é¢é£ä»ããªããã°ãªããŸããã ãããŠãã bind ããšããåèªã§æåã«åæ ããŠæå®ããã®ã¯ã ãã€ã³ãé¢æ°ã®å®çŸ©ã§ããããã¯>> =æŒç®åãšããŠèšè¿°ãããŠããŸã ã 次ã«ãçµåfx㯠x >> = fãšããŠæžãæããããŸãã 次ã«ã ãŠãããã¯returnãšåŒã°ããŸãã ãããŠç¬¬äžã«ãé¢æ°>> =ããã³returnããªãŒããŒã©ã€ãããã«ã¯ãåã¯ã©ã¹ã䜿çšããå¿ èŠããããŸãã Haskellã§ã¯ãDebuggableã¯Writerã¢ãããMultivaluedã¯Listã¢ãããRandomizedã¯Stateã¢ããã§ãã 次ã®ãã®ã®å®çŸ©ã確èªããå Žå
Control.Monad.Writer Control.Monad.List Control.Monad.State
æ§æç³ã«æ£ç¢ºã«è¡šç€ºãããŸãããããã¯äžã§æžããå®çŸ©ã§ãã ãããã¢ããã«åºäŒã£ãæ¹æ³ã§ãïŒ
ã¢ããæ§æ
ç§ã¯ããã«å€ãã®æéãè²»ãããããããŸããïŒãããŠããã®ã»ã¯ã·ã§ã³ã¯ã¹ãããã§ããŸãïŒã ããè¯ã玹ä»ããããããããŸãã
ãã€ã³ãé¢æ°ãã©ã®ããã«é¢æ°ããã€ã³ããã䟿å©ãªæ¹æ³ãæäŸããéåžžã«ãã³ãŒããæžãããšããããªããæãããšãã§ããããèŠãŠããŸããã ããããHaskellã¯ããã«é²ãã§ããã ãã€ã³ãé¢æ°ãçŽæ¥äœ¿çšããå¿ èŠãããããŸãããHaskellã«èªåçã«æ¿å ¥ããããã«ãå°ãããããšãã§ããŸãã
å ¬åŒã®åã¯ã©ã¹ã䜿çšããŠãå ã®ãããã°ã®äŸã«æ»ããŸãããã ãã¢ïŒaãsïŒã䜿çšããå Žåã Writer Charåã®Writer ïŒaãsïŒã䜿çšããŸãã ãã®ãã¢ãååŸããã«ã¯ã runWriteré¢æ°ã䜿çšããŸãã 1ã足ãã2ãæãã7ãåŒããŠãåã¹ãããã§è¡ãããšãæžãçããããšããŸãã æžã蟌ããåèš
return 7 >> =ïŒ\ x-> WriterïŒx + 1ã "incã"ïŒïŒ >> =ïŒ\ x-> WriterïŒ2 * xã "doubleã"ïŒïŒ >> =ïŒ\ x->ã©ã€ã¿ãŒïŒx-1ã "decã"ïŒïŒ
ãã®çµæã«runWriteré¢æ°ãé©çšãããšãïŒ15ãâ inc.double.decãâïŒãåŸãããŸãã ããããã³ãŒãã¯ãŸã ãããã§ã¯ãããŸããã ãããæ¹åããã«ã¯ãdoæ§æã䜿çšããŸãã ã¢ã€ãã¢ã¯
x <-yãè¡ã ããå€ãã®ã³ãŒã
ã³ã³ãã€ã©ã«ãã£ãŠèªåçã«æžãæããããŸã
y >> =ïŒ\ x-> do ããå€ãã®ã³ãŒãïŒã
ãŸã
ãã x = yãšãã ããå€ãã®ã³ãŒã
ã«æžãæããããŸã
ïŒ\ x-> do ããå€ãã®ã³ãŒãïŒy
ãããŠ
ãã è¡šçŸ
ãã åŒãæ®ããŸãã
次ã®ããã«ã³ãŒããæžãæããããšãã§ããŸãã
ãã x = 7ãšãã y <-ã©ã€ã¿ãŒïŒx + 1ã "inc \ n"ïŒ z <-ã©ã€ã¿ãŒïŒ2 * yã "double \ n"ïŒ ã©ã€ã¿ãŒïŒz-1ããdec \ nãïŒ
ãã®ãšã³ããªã¯éåžžã«æããã§ãã y <-...ãšæžããšãå³èŸºã®åŒã¯x + 1ã§ãããšä»®å®ã§ããŸãããæäœã«ãã£ãŠå¯äœçšãçºçããŸãã
å¥ã®äŸã 6次ã®æ ¹ãèŠã€ããé¢æ°ãæ±ãã«ãã圢ã§èšè¿°ããŸã
return 64 >> =ïŒ\ x-> sqrt 'xïŒ>> =ïŒ\ y-> cbrt' yïŒ
ããèªã¿ãããããã«ã³ãŒããæžãçŽãããšãã§ããŸã
ãã let x = 64 y <-sqrt 'x z <-cbrt 'y zãè¿ã
éåžžã®ãããŸãã§ãªãã³ãŒãã®ããã«èŠããã³ãŒããèšè¿°ããHaskellãèªåçã«æ¿å ¥ãããã€ã³ããã€ã³ãã£ã³ã°ãæé»çã«åŒã³åºããŠããããŸãã«ããããšãã§ããŸãã
ãã®ãããªæ§æã®äœæã¯å€©æã®ä»äºã§ãã ãã¶ããããªãã¯ãããçºæããããšãã§ããŸããããç§ã¯ã§ããªãã£ããšç¢ºä¿¡ããŠããŸãã ãããããããã®è¿œå ã¯ãå®éã«ã¯ã¢ããã®äžã«ããåãªãæ§æäžã®ç ç³ã§ãã åºç€ãšãªãã¢ããããã€ã¹ãæãä»ãããšãã§ãããšç¢ºä¿¡ããŠããŸãã
å ¥å/åºå
ã¢ãããå®å šã«ç解ããåã«æ³šæããªããã°ãªããªãããšããã1ã€ãããŸãã å€ã®äžçãšã®ã³ãã¥ãã±ãŒã·ã§ã³ã äžèšã§æžããããã®ã¯ãã¹ãŠãçŽç²ãªé¢æ°åèšèªã«é©çšã§ããŸãã ããããä»åºŠã¯æ pureã§çŽç²ãªé¢æ°åèšèªã«æ³šç®ããŸãããã ãã®ãããªèšèªã§ã¯ãç©äºãã©ã®ãããªé åºã§èšç®ããããããããŸããã ãããã£ãŠããæ°åãå ¥åããŠãã ããããšããã¡ãã»ãŒãžã衚瀺ããé¢æ°ãšãæ°åãèŠæ±ããå¥ã®é¢æ°ãããå Žåãæ°åãèŠæ±ãããåã«ã¡ãã»ãŒãžãæžã蟌ãŸããããšãä¿èšŒã§ããŸããã ã©ã³ãã é¢æ°ã®äŸãèŠãŠãã ãããã©ã³ãã ã«ãŒãã«ããã¹ãŠã®é¢æ°ãã©ã®ããã«ééããŠã randomãåŒã³åºããã³ã«äœ¿çšã§ããããã«ãªã£ãŠããããšã«æ³šç®ããŠãã ããã äžå®ã®é åºããããŸãã x >> = f >> = gããããšããŸã gã¯fã«ãã£ãŠè¿ãããã°ã¬ã€ã³ã䜿çšããŸããfã gã®åã«çªå·ãçæããããšã確èªã§ããŸãã ãããŠããã¯ãååãšããŠãã¢ããã䜿çšããŠèšç®ãåçåã§ããããšã瀺ããŠããŸãã
次ã«ãã³ã³ãã€ã©ã§ã®ä¹±æ°ã®å®è£ ãææ¡ããŸãã ããã¯ãHaskellå®è¡å¯èœãã¡ã€ã«ã«æ¿å ¥ãããCãŸãã¯ã¢ã»ã³ãã©ãŒã³ãŒãã§ãã ãã®ã³ãŒãã¯I / Oãå®è¡ããããã«å€æŽãããŠããŸããgã®åã«fãå®è¡ãããããšãä¿èšŒã§ããŸãã ããã¯ãI / OãHaskellã§åäœããããã§ããã¢ããã§ãã¹ãŠã®I / Oãå®è¡ããŸãã ãã®å Žåãã¿ã€ãa-> bã®é¢æ°ãšå€çã®å¯äœçšã¯ãã¿ã€ãa-> IO bã«ãªããŸãã ã¿ã€ãIOã¯ãã©ãã¯ããã¯ã¹ã§ãããã®äžã«äœãããããç¥ãå¿ èŠã¯ãããŸããã ïŒãã¶ãããã¯ã©ã³ãã ãªäŸãšããŠæ©èœãããããããŸããããããã§ã¯ãªããããããŸããïŒx >> = f >> = gfã¯gã®åã«å®è¡ãããããšãç¥ãå¿ èŠããããŸãã
ã«ããŽãªãŒçè«
ãããŠæåŸã«ã ã¢ããã¯ã«ããŽãªãŒçè«ã®æèã§çºæãããŸããã ãããŠãç§ã¯æ¬¡ã®æ¥ã«ãã®æ¥ç¶ãé¢ããŸãã
è£éºïŒä¹±æ°ã䜿çšããå®å šãªãµã³ãã«ã³ãŒã
ã€ã³ããŒãã©ã³ãã bind ::ïŒa-> StdGen->ïŒbãStdGenïŒïŒ->ïŒStdGen->ïŒaãStdGenïŒïŒ->ïŒStdGen->ïŒbãStdGenïŒïŒ bind fx seed = letïŒx 'ãseed'ïŒ= x seed in fx 'seed' åäœxg =ïŒxãgïŒ ãªããf =åäœã f
ãããŠãç§ãã¡ãããããšããŠããããšïŒãããã®æé ã«åŸãããšã§2ïŒ10é²æ°ïŒã®æ°åãæ§ç¯ããã
ïŒ1ïŒ[0.9]ã®ç¯å²ã®ä¹±æ°ãäœæããŸã
ïŒ2ïŒ10ãæããŸã
ïŒ3ïŒç¯å²[0.9]ããå¥ã®ä¹±æ°ãè¿œå ããŸã
äžè¬ã«ãããã¯addDigitã®ãããªãã®ã®åæã§ãã ïŒ* 10ïŒã addDigit ã ãããããã¹ãŠã®ã³ãŒãã«ã©ã³ãã ãªç²åºŠãæž¡ãå¿ èŠãããããšãç¥ã£ãŠããŸãã ãŸãã addDigitã®å®çŸ©ãæ€èšããŸãã
addDigit ng = letïŒaãg 'ïŒ=ã©ã³ãã g inïŒn + a `mod` 10ãg'ïŒ
n +ä¹±æ°ãšæ°ããã·ãŒãã§æ§æããããã¢ãè¿ããŸãã 圌ã¯è¿œå ã®åŒæ°ãšããŠç©ç©ã䜿çšããŠããããšã«æ³šæããŠãã ããã é¢æ°ã¯addDigit n = let a = random in n + a `mod` 10ã§ãããéçŽç²ãªèšèªã§ç§»æ€å¯èœã§ãããšèããããšãã§ããŸãã
次ã«ã10ãæããæäœã玹ä»ããŸããããã¯éåžžã®æäœã§ããªããã䜿çšããŠãæ¹åãã§ããŸãã ååŸããŸã
ã·ãã=ãªããïŒ* 10ïŒ
ãããŠãããã決å®çãªç¬éã§ãã åæããããšã¯ã§ããŸãããã代ããã«ãã€ã³ãã£ã³ã°ã䜿çšããŠãé¢æ°ãçµã¿åããå¯èœãªåœ¢åŒã«å€æã§ããŸãã åèšaddDigitã ïŒ* 10ïŒ.addDigitã¯æ¬¡ã®ããã«ãªããŸã
ãã¹ã::æŽæ°-> StdGen->ïŒæŽæ°ãStdGenïŒ test = addDigitããã€ã³ãããŸãã ãã€ã³ãã·ããã addDigit
次ã«ããæ°ã«å ¥ãã®çªå·ã䜿çšããŠç©ç©ãäœæããã³ãŒããå®è¡ããŸã
g = mkStdGen 666 main = print $ test 0 g
ãµã³ãã«ãæžããšããç§ã¯ç¹ã«Monadåã¯ã©ã¹ã䜿çšããªãã£ãããšã«æ³šæããŠãã ããã ãããã£ãŠãäœãããªãããé ãããããã¹ãŠãæ瀺çã«è¡ãããŸããã