ãã€ã¯ã»ãŽã¡ããš
åã®èšäºã§ã
ã¢ããåã¯ã©ã¹ã®2ã€ã®åºæ¬çãªåé
æŒç®ã«ã€ããŠèª¬æããŸããããã€ã³ãæŒç®åïŒãã€ã³ãã
>> = ïŒãš
æ»ãé¢æ°ã§ãã ãã®èšäºã§ã¯ã
ã¢ããåã¯ã©ã¹ã®å®çŸ©ã«
è³ã ãã¢ããã®æ³åã«ã€ããŠèª¬æããŸãã
å®å
šãªã¢ããåã¯ã©ã¹
Monadåã¯ã©ã¹ã®å®çŸ©å
šäœãèŠãŠã¿ãŸãããã
ã¯ã©ã¹ Monad m ããã§
ïŒ >> = ïŒ :: m a -> ïŒ a- > m b ïŒ -> m b
return :: a- > m a
ïŒ >> ïŒ :: m a- > m b- > m b
fail :: æåå -> m a
ããç¥ãããŠããã®ã¯ãåãã¿ã€ãã®
>> =æŒç®åãš
returné¢æ°ã§ããããããã«å ããŠ
>>æŒç®åãš
failé¢æ°ããããŸãã 圌ãã¯ã©ãããæå³ã§ããïŒ
倱æé¢æ°ã¯ãæåã¯ãšã©ãŒãå ±åããéåžžã«åå§çãªæ¹æ³ã§ãã
>> =æŒç®åãäžèŽãšã©ãŒã®ããã«ã¿ã€ã
aã®å€ãã¿ã€ã
a-> mbã®é¢æ°ã«ãã€ã³ãã§ããªãå Žåã«åŒã³åºãããŸãã éå±ãªããããã®ã¡ã«ããºã ã®è©³çŽ°ã«ã¯è§ŠããŸããã å¿
èŠã«å¿ããŠ
ã Haskell
Webãµã€ãã®ããã¥ã¡ã³ããåç
§ããŠãã ããã ã»ãšãã©ã®å Žåã
倱æã®å¿é
ã¯å¿
èŠ
ãããŸããã
>>æŒç®åã¯ããå°ãèå³æ·±ããã®ã§ãã 圌ã¯ãã®ã¿ã€ããæã£ãŠããŸãïŒ
ïŒ >> ïŒ :: m a- > m b- > m b
ãã®æŒç®åã¯ãåé
ã·ãŒã±ã³ã¹æŒç®åã§ãã ç¹ã«ãã¢ããã¢ããªã±ãŒã·ã§ã³ã®å€åœ¢ïŒ
>> =ãŸãã¯ããã€ã³ããïŒã§ãã¿ã€ã
mbã® ãã¢ã¯ã·ã§ã³ããå®è¡ããåã«ãã¿ã€ã
aã®ã¢ã³ããã¯ãããå€ãç Žæ£ããŸãã 次ã®ããã«å®çŸ©ãããŸãã
mv1 >> mv2 = mv1 >> = ïŒ \ _- > mv2 ïŒ
ããã§ãã¢ããå€
mv1ããã¢ã³ããã¯ãããå€ã¯
ãã¹ãŠæåŠãããæçµçãªã¢ããå€
mv2ãè¿ãããããšãããããŸãã æŒç®åã¯ãå±éãããå€ã®åã
ïŒïŒã®å Žåãã€ãŸã空ã®åã§ããå Žåã«åœ¹ç«ã¡ãŸãã
putStrLné¢æ°ã¯è¯ãäŸãšèããããšãã§ããŸãã
putStrLn :: æåå -> IO ïŒ ïŒ
2è¡ã次ã
ã«å°å·ããåè¡ã®åŸã«æ¹è¡ãå
¥ããããšããŸãã ãããè¡ãããšãã§ããŸãïŒ
putStrLn ãããã¯ã¹ããªã³ã°1ã§ããã >> putStrLn "ããã¯æåå2ã§ãã"
ãããŠããªããããæ©èœããã®ã§ããïŒ ã¿ã€ããèŠãŠã¿ãŸãããã
ïŒ putStrLn "ããã¯æåå1ã§ãã" ïŒ :: IO ïŒ ïŒ
ïŒ putStrLn "ããã¯æåå2ã§ãã" ïŒ :: IO ïŒ ïŒ
ã€ãŸãã
>>æŒç®åã¯ãã¿ã€ã
IOïŒïŒã® 2ã€ã®ã¢ããå€ããã¿ã€ã
IOïŒïŒã® 1ã€ã®çµæã®ã¢ããå€ã«çµåããŸãã
>>æŒç®åã䜿çšããŠããã®ã±ãŒã¹ã«ç¹åããŠã¿ãŸãããã
ïŒ >> ïŒ :: m a- > m b- > m b
mã
IOã§ã
aãš
bã
ïŒïŒã®å Žåã次ã®ããã«ãªããŸãã
ïŒ >> ïŒ :: IO ïŒ ïŒ -> IO ïŒ ïŒ -> IO ïŒ ïŒ
æžãããšã§ãããããã
>>æŒç®åã2ã€ã®ãã¢ã¯ã·ã§ã³ããé£ç¶ããŠå®è¡ãããã€ãŸãè¡ãåºåãããšèšãããšãã§ããŸãã
ããè€éãªäŸã§ãã 端æ«ããããã¹ãè¡ãèªã¿åãã2åå°å·ããå¿
èŠããããŸãã 次ã®ããã«ã§ããŸãã
readAndPrintLineTwice :: IO ïŒ ïŒ
readAndPrintLineTwice = getLine >> = ïŒ \ s -> ïŒ putStrLn s >> putStrLn s ïŒ ïŒïŒ
æŒç®åã®åªå
é äœã®ãããã¬ã³ãŒãã¯è§æ¬åŒ§ãªãã§æ®ãããšãã§ããŸãã
readAndPrintLineTwice :: IO ïŒ ïŒ
readAndPrintLineTwice = getLine >> = \ s- > putStrLn s >> putStrLn s
ããã¯ã©ãããæå³ã§ããïŒ
getLine-ã¢ããå€ïŒãã¢ã¯ã·ã§ã³ãïŒã端æ«ããããã¹ãè¡ãèªã¿åããŸãã
>> =æŒç®åã¯ããã®æååãã¢ããå€ãããã¢ã³ããã¯ãããåå
sã«é¢é£ä»ããŸãïŒ
\ s-> putStrLn s >> putStrLn sã¯ãã¢ããé¢æ°ã
>> =æŒç®åã®2çªç®ã®åŒæ°ã§ããããïŒã 次ã«ã
sãšããè¡ããã¢ããã®å€
putStrLn s >> putStrLn sã«ãã£ãŠäœ¿çšãããé£ç¶ããŠ2ååºåãããŸãã
ããªããèšãããšãç¥ç§çã«æãããªããããã¯ããªãã®ããã§ã¯ãããŸããã ããã§å¥åŠãªããšãèµ·ãã£ãŠããŸãããã¹ããŒãã¢ããã«ã€ããŠè©±ããããŸã§ã¯èª¬æã§ããŸããã ããããä»ã§
㯠ããŸã
ã©ã®ããã«èµ·ãã£ãŠããã®
ããå®å
šã«ç解
ããŠããªãå Žåã§ãã
äœãèµ·ãã£ãŠããã®
ãã远跡ã§ããªããã°ãªããŸããã
ä»ãå°ãæ»ã£ãŠã¢ããã®æ³åãèŠãŠãããŸãã ãããã¯ãç¹å®ã®ã¢ããããšã«
>> =æŒç®åãš
æ»ãé¢æ°ã䜿çšããéã«å€§ããªåœ¹å²ãæãããŸãã ãã®åŸãããå®çšçãªè³æã«ç§»ããŸãã
ã¢ããã£ãºã ã®äžæ³å
å€ãã®éèŠãªæ³åã¯3ã€ã®ã°ã«ãŒãã«åé¡ãããŸãããã¥ãŒãã³ã®3ã€ã®æ©æ¢°æ³åãç±ååŠã®3ã€ã®æ³åãAzimov Roboticsã®3ã€ã®æ³åãææéåã®3ã€ã®ã±ãã©ãŒæ³åãªã©ã§ãã ãã¡ãããã3ã€ã®ã¢ããã®æ³åããäœãããéèŠã§ããããšãé€ããŠããã®ã¢ããã¯éããŸããã ;-)
>> =æŒç®åãš
æ»ãé¢æ°ãç¹å®ã®ã¢ããã«å¯ŸããŠæå¹ã§ããããã«ã¯ããããã¯ãã®ã¢ããã«å¯ŸããŠæ£ããåãæããªããã°ãªããŸããã ãããã£ãŠãããšãã°ãå®çŸ©
>> =ããã³
Maybeã¢ããã®æ»ãå€ã«ã¯ããã®ã¿ã€ããå«ãŸããŸãã
ïŒ >> = ïŒ :: ãã¶ã a -> ïŒ a- > ãã¶ã b ïŒ -> ãã¶ã b
return :: a- > ãã¶ã a
ãããŠãã¢ããã®å Žåã
IOã«ã¯
IOã¿ã€ããå«ãŸããŸã
ïŒ >> = ïŒ :: IO a -> ïŒ a- > IO b ïŒ -> IO b
return :: a- > IO b
ãã ããããã§ã¯ååã§ã¯ãããŸããã ãããã®é¢æ°/æŒç®åã¯ã3ã€ã®ãã¢ããã®æ³åããæºããããã«ãå¿
èŠã§ãã ã¢ããã®æ³åã¯å®éã«ã¯éåžžã«åçŽã§ãã ãããã¯ãã¢ããæ§æãäºæž¬å¯èœãªæ¹æ³ã§æ©èœããããã«èšèšãããŠããŸãã æåã«ã¢ããã®æ³åã®ãçŽ æµãªãããŒãžã§ã³ãæäŸãã次ã«é垞説æãããŠããããã«ïŒugãïŒæ¹æ³ã瀺ããŸãã ïŒããããšãããããŸãããçŽ æµãªããªãã·ã§ã³ã®æ¹ããã£ãšç解ããããã§ããïŒ
çŽ æµãªããŒãžã§ã³
以äžã¯ãã¢ããåæã®èŠ³ç¹ããè¡šçŸããã3ã€ã®ã¢ããåã®çŽ æŽãããå®çŸ©ã§ãïŒæŒç®å
ïŒ> =>ïŒã¯é¢æ°åæã®ã¢ããæŒç®åã§ããããšãæãåºããŠãã ããïŒïŒ
1 return > => f == f
2 ã f > => return == f
ïŒ ã ïŒ f > => g ïŒ > => h == f > => ïŒ g > => h ïŒ
ãããã®æ³åŸã¯ç§ãã¡ã«äœãäŒããŠããŸããïŒ
èŠå1ãš2ã¯ã
æ»ãå€ãæå®ããŸããããã¯ãé¢æ°ã®åé
åæã®åäœïŒäžç«èŠçŽ ïŒã§ãïŒæåã®èŠåã¯ãæ»ãå€ãå·ŠåŽã®åäœã§ã2çªç®ã®èŠåãå³åŽã®åäœã§ããããšã瀺ããŸãïŒã ã€ãŸããåé
é¢æ°
fãäœæã
㊠ïŒä»»æã®é åºã§ïŒè¿ããšãåã«é¢æ°
fãè¿ãããŸãã ã¢ããã°ã¯ã0-æŽæ°ãå ç®ããæ©èœã®äžç«èŠçŽ ã1-æŽæ°ä¹ç®æ©èœã®äžç«èŠçŽ ãšèŠãªãããšãã§ããŸãã ãããã®å Žåãã察å¿ããé¢æ°ã䜿çšããŠéåžžã®å€ã«æ¥ç¶ããããã¥ãŒãã©ã«èŠçŽ ã¯ããã®å€ãåçŽã«è¿ããŸãã
æ³å3ã¯ãåæã®åé
é¢æ°ã¯çµåçã§ãããšè¿°ã¹ãŠããŸãã3ã€ã®åé
é¢æ°ïŒ
f ã
g ã
h ïŒãçµã¿åããããå Žåãã©ã¡ããæåã«æ¥ç¶ããŠãããŸããŸããã ããã¯ãæŽæ°ã«é©çšãããšãã«å ç®ãšä¹ç®ãçµåãããšããäºå®ã«é¡äŒŒããŠããŸãã
ãããã®æ³åŸã¯ãããŸãã«ãªãã¿ããªãããã«æãããŸãããïŒ å¯Ÿå¿ãããæ³åããèŠãŠã¿ãŸããããããã¯éåžžã®åææ©èœã«ãã£ãŠæºããããŸãã
1 id f == f
2 ã f id == f
ïŒ ã ïŒ fãg ïŒ ã h == f ã ïŒ gãh ïŒ
idã¯äžç«èŠçŽ ããŠãããã§ãã é¡äŒŒç¹ãèŠã€ããŸãããïŒ ãŠããããå·ŠãŸãã¯å³ã«é
眮ããé¢æ°ãåæãããšãåãé¢æ°ãåã³äžããããåæé¢æ°ã¯çµåæ§ã«ãªããŸãã ã³ã³ããžã·ã§ã³ã®ã¢ããé¢æ°ã¯é£æ³çã§ãªããã°ãªããã
æ»ãå€ã¯åäžã®é¢æ°ã®ã¢ããåçç©ã§ãªããã°ãªããªãã®ã§ãã¢ããåæã®åäœã¯éåžžã®ã³ã³ããžã·ã§ã³ã®åäœãšåæ§ã«äºæž¬å¯èœã§ãã
ããã°ã©ããŒã®èŠ³ç¹ãããããã®æ³åŸã®æå³ã¯äœã§ããïŒ ã¢ãããã€ã³ããªãžã§ã³ãã«åäœããããã«ãããã®ã§ã
returnãš
>> =ã®å®çŸ©ã¯ãããã®æ³åãæºãããªããã°ãªããŸããã
>> =ããã³
returnã®å®çŸ©ã確èªããæ¹æ³ãããã«åŠç¿ããŸãã [ã¢ããã®æ³åã¯
>> =æŒç®åã§ã¯ãªã
>>>æŒç®åã§è¡šãããŸããã
>> =ã䜿çšããŠããŒãžã§ã³ã衚瀺ãããããšã«æ³šæããŠãã ãããããã¯åçã§ãã]
ãã ã ããã£ããããããŸãïŒHaskell
ã¯ã¢ããã®æ³åããã§ãã¯
ããŸãã ïŒ ãã§ãã¯ãããã®ã¯ã
æ»ãå€ãš
>> =å®çŸ©ã¿ã€ããæ£ããããšã ãã§ãã æ³åŸãå®æœãããŠãããã©ããã«ããããããããã°ã©ãã¯ç¢ºèªããå¿
èŠããããŸãã
å€ãã®äººãããªãHaskellãã¢ããã®æ³åããã§ãã¯
ã§ããªãã®ãïŒããšå°ããŸããçãã¯ç°¡åã§ãïŒHaskellã¯ãŸã 匷åã§ã¯ãããŸããïŒ ã¢ããã®æ³åã®æ£ããã蚌æããååã«åŒ·åãªèšèªãååŸããã«ã¯ãå®ç蚌æè
ïŒå®ç蚌æè
ïŒã®ãããªãã®ãå¿
èŠã§ãã å®çã®èšŒæã¯æ¯ãã®ããããªãã®ã§ãããããã°ã©ãã³ã°ã®æªæ¥ãããããŸããããåŸæ¥ã®ããã°ã©ãã³ã°èšèªãããã¯ããã«è€éã§ãã èå³ãããã°ãCoqå®çã®å°æ¬ããã蚌æ ããã
ãŸã ãããã¯
ããããå
¥æã§ã
ãŸã ã ããããHaskellã§ã¯ãããã°ã©ããŒã¯ãèªåãæžããã¢ãããã¢ããã®æ³åã«éåããªãããã«æ³šæããå¿
èŠããããŸãã
glyãããŒãžã§ã³
niceããŒãžã§ã³ã®åé¡ã¯ã
> =>æŒç®åã
Monadåã¯ã©ã¹ã§çŽæ¥å®çŸ©ãããŠããªãããšã§ãã 代ããã«ãäžã§ç€ºããããã«ã
>> =æŒç®åãå®çŸ©ããã
> =>æŒç®åã掟çããŸãã ãããã£ãŠãå®çŸ©ã
>> >>ããã³
returnæŒç®åã«å¶éããå Žåã
returnããã³
>> =ã®ã¿ãå«ãã¢ããåãå¿
èŠã§ãã ãŸãããã®åœ¢åŒã§ã¯ãåã®ã»ã¯ã·ã§ã³ã§ç€ºãããã®ãããçŽæçã§ã¯ãããŸããããHaskellã®ã¢ããã«é¢ããã»ãšãã©ã®æžç±ãããã¥ã¡ã³ãã§æäŸãããŠããŸãã
>> =æŒç®åãš
æ»ãé¢æ°ã«é¢ããŠãã¢ããã®æ³åã¯æ¬¡ã®ããã«ãªããŸãã
1 return x >> = f == f x
2 ã mv >> = return == mv
ïŒ ã ïŒ mv >> = f ïŒ >> = g == mv >> = ïŒ \ x -> ïŒ f x >> = g ïŒ ïŒ
ããã§ãç°ãªãå€ã®ã¿ã€ãã¯æ¬¡ã®ãšããã§ãã
mv :: m a
f :: a- > m b
g :: b- > m c
ããã€ãã®ã¿ã€ã
a ã
b ã
cããã³ããçš®ã®ã¢ãã
mã«å¯Ÿã㊠ã
çŽ æµãªããŒãžã§ã³ããã¢ããåã®ãããŒãžã§ã³ã掟çããã
楜ããã§ãçŽ æµãªããŒãžã§ã³ããã¢ããåã®ãããŒãžã§ã³ãæšæž¬ããŠã¿ãŸãããã èšç®ã§ã¯ãäžèšã§æ€èšããã¢ããåæã®å®çŸ©ãå¿
èŠã§ãã
f > => g = \ x -> ïŒ f x >> = g ïŒ
æ³åŸ1ïŒ
return > => f == f
\ x -> ïŒ return x >> = f ïŒ == \ x- > f x
return x >> = f == f x -QEDïŒã蚌æããããã«å¿
èŠãïŒ
\ x-> fx㯠fãšåãã§ããããšã«æ³šæããŠãã ããã
æ³åŸ2ïŒ
f> => return == f
\ x->ïŒfx >> = returnïŒ== \ x-> fx
fx >> = return == fx
let mv == fx
mv >> = return == mv-QED
æ³åŸ3ïŒ
ïŒ f > => g ïŒ > => h == f > => ïŒ g > => h ïŒ
\ x -> ïŒ ïŒ f > => g ïŒ x >> = h ïŒ == \ x -> ïŒ f x >> = ïŒ g > => h ïŒ ïŒ
ïŒ f > => g ïŒ x >> = h == f x >> = ïŒ g > => h ïŒ
ïŒ \ y -> ïŒ f y >> = g ïŒ ïŒ x >> = h == f x >> = ïŒ \ y -> ïŒ g y >> = h ïŒ ïŒ
-èšç®ïŒ\ y->ïŒf y >> = gïŒïŒxååŸïŒïŒf x >> = gïŒ
ïŒ f x >> = g ïŒ >> = h == f x >> = ïŒ \ y -> ïŒ g y >> = h ïŒ ïŒ
-mv = f xãšãã次ã«ïŒ
ïŒ mv >> = g ïŒ >> = h == mv >> = ïŒ \ y -> ïŒ g y >> = h ïŒ ïŒ
-gãfã«ãhãgã«çœ®ãæããŸãã
ïŒ mv >> = f ïŒ >> = g == mv >> = ïŒ \ y -> ïŒ f y >> = g ïŒ ïŒ
-æ£ããåŒã§yãxã«çœ®ãæããŠã以äžãååŸããŸãã
ïŒ mv >> = f ïŒ >> = g == mv >> = ïŒ \ x -> ïŒ f x >> = g ïŒ ïŒ -QED
èšç®ã¹ããã
ïŒ\ y->ïŒfy >> = gïŒïŒxã§ã¯ãåã«é¢æ°å
šäœïŒ
\ y-> ... ïŒãåŒæ°
xã«é©çšããŸãã ãã®å Žåã
yã¯é¢æ°æ¬äœã®å€æ°
xã«çœ®ãæãããïŒçç¥èšå·ïŒ...ïŒã§ç€ºãããŸãïŒãé¢æ°æ¬äœãçµæãšããŠè¿ãããŸãã Lingoé¢æ°åããã°ã©ãã³ã°èšèªã§ã¯ããã®æäœã¯
ããŒã¿åæžãšåŒã°ããŸãã {1ïŒãã®å Žåãæã
ã¯ã©ã ãèšç®ãšåŒã°ããæ°åŠã®ã»ã¯ã·ã§ã³ã«ã€ããŠè©±ããŠãããããã¯ããšãããããŒã¿åæžãèšè¿°ããŠããã}ããŒã¿åæžã¯ãé¢æ°ãèšç®ããäž»ãªæ¹æ³ã§ããã 次ã®2ã€ã®é¢æ°ãæ£ããããã
yã
xã§çœ®ãæããããæåŸã®ã¹ãããã¯æ£ããã§ãã
\ x- > f x
\ y- > f y
-ããã¯ãŸã£ããåãã§ãïŒæ£åŒãªåŒæ°ã®ååã¯éèŠã§ã¯ãããŸããïŒã Lingoé¢æ°åèšèªã§ã¯ã2ã€ã®é¢æ°ã¯
ã¢ã«ãã¡çãšåçã§ãã ä»ã®æé ãç解ããŠããå¿
èŠããããŸãã
ã¢ã€ãã¢ã¯äœã§ããïŒ
ã¢ããã®æ³åã¯ãã³ãŒãã§æã
䜿çšãããé·ãåŒãçãåŒã«çœ®ãæããŸãïŒããšãã°ã
return x >> = fã®ä»£ããã«ãåã«
fxãæžãããšãã§ããŸãïŒã ãã ãã次ã®èšäºã§ã¯ãã¢ããã®æ³åã®äž»ãªå©ç¹ã¯ãç¹å®ã®ã¢ããã®
ãªã¿ãŒã³ãš
>> =ã®å®çŸ©ãå°åºã§ããããšã§ãã
ãã®èšäºã®æåŸã§ããã¡ããšããæ§æ圢åŒã®èšè¿°ã瀺ããããšæããŸãããã®å©ããåããŠãã¢ããã®ã³ãŒããããè¯ãèŠããããã«ãªããŸãã
æœè±¡ç
äžèšã§å®çŸ©ãã
readAndPrintLineTwiceé¢æ°ãæãåºããŠãã ããã
readAndPrintLineTwice :: IO ïŒ ïŒ
readAndPrintLineTwice = getLine >> = \ s- > putStrLn s >> putStrLn s
圌女ã«ã¯1ã€ã®å©ç¹ããããŸãïŒããã¯1è¡ã§æžãããŠããŸãã æ¬ ç¹ã¯ãäžçã§æãèªã¿ãããè¡ã§ã¯ãããŸããã Haskellã®èšèšè
ã¯ãã¢ããå®çŸ©ãèªãã®ãé£ããããšãå€ãããšã«æ°ä»ããå®çŸ©ãèªã¿ãããããæ¬åœã«çŽ æŽãããæ§æç³ãèŠã€ããŸããã
ãã®æ§æç³ã®åºç€ã¯ãã¢ããã³ãŒãã®èšå€§ãªæ°ã®æäœã2ã€ã®åœ¢åŒã§èšè¿°ãããŠãããšãã芳å¯ã§ãã
-ãã©ãŒã 1ã
-mv :: m a
-f :: a-> m b
mv >> = \ x- > mf x
-ãã©ãŒã 2ã
-mv :: m a
-mv2 :: m b
mv >> mv2
è¡šèšæ³ã¯ããããã®2ã€ã®åœ¢åŒãèªã¿ãããããããšãç®çãšããŠèšèšãããŸããã
doããŒã¯ãŒãã§å§ãŸãããã®åŸã«ããã€ãã®åé
æŒç®ãç¶ããŸãã ãããã£ãŠããããã®2ã€ã®äŸã¯
doè¡šèšã§èšè¿°ãã
ãŸã ã
-ãã©ãŒã 1ãè¡šèšæ³ã
do v < -mv
f v
-ãã©ãŒã 2ãè¡šèšæ³ã
MVãè¡ã
mv2
ãã©ãŒã 1ã®æåã®è¡ã¯ãã¢ããå€
mvãååŸããããã
vãšåŒã°ããéåžžã®å€ã«ãã¢ã³ããã¯ãããããšãæå³ããŸãã 2è¡ç®ã¯
vãã
fãèšç®ããŠããã ãã§ãã æåå
fvã®çµæã¯ãåŒå
šäœã®çµæã§ãã
ãã©ãŒã 2ã§ã¯ãæåã®è¡ã§ã¢ããå€ïŒãã¢ã¯ã·ã§ã³ãïŒ
mvã ãå®è¡ããããŸãã 2è¡ç®ã¯ãå¥ã®ã¢ããå€ïŒãã¢ã¯ã·ã§ã³ãïŒ
mv2ã ãå®è¡ãããŸãã ãããã£ãŠã
>>æŒç®åã®ããã«ã
mvãš
mv2ãã·ãŒã±ã³ã¹ã«
é£çµããè¡šèšæ³ããããŸãã
Haskellã³ã³ãã€ã©ã¯ã䟿å©ãª
doè¡šèšãForm 1ããã³Form 2ã®é
doãšã³ããªã«å€æããŸããããã¯åãªãæ§æå€æã§ãããäž¡æ¹ã®ãšã³ããªã®æå³ã¯åãã§ãã ããã«ãäž¡æ¹ã®åœ¢åŒãåè¡šèšæ³ã®1ã€ã®è¡šçŸã«æ··åšãããããšãã§ããŸãã äŸïŒ
-mv :: m a
-v1 :: a
-f :: a-> m b
-v2 :: b
-mv3 :: m c
ãã
v1 < -mv
v2 < -f v1
mv3
v2ãè¿ã
ããã¯ãŸã£ããåãã§ãïŒ
mv >> = ïŒ \ v1- >
ïŒ f v1 >> = ïŒ \ v2- >
ïŒ mv3 >>
ïŒ v2ãè¿ã ïŒ ïŒ ïŒ ïŒ ïŒïŒ
ãŸãã¯skokbokãªãïŒ
mv >> = \ v1- >
f v1 >> = \ v2- >
mv3 >> v2ãè¿ã
ã¢ããåŒã倧ãããªã£ãŠãã
do- formã¯èªã¿ãããã
doãªãïŒ "Sugared"ãšãåŒã°ããïŒã®ãã©ãŒã ã¯èªã¿ã«ãããªãããšããããããŸãã ãããã
do- abstractãååšããçç±ã§ãã
do- abstractã¯ã1ã€ã ãã§ãªãã
ãã¹ãŠã®ã¢ããã§æ©èœããã®ã¯çŽ æŽãããããšã§ãã
ããã«ã
doè¡šèšãšã·ã¥ã¬ãŒã¬ã¹è¡šèšã1ã€ã®åŒã«æ··åšãããããšãã§ããŸãã ãã®ããã«ïŒ
do v1 < -mv
v2 < -f v1
mv3 >> v2ãè¿ã
ããã¯äŸ¿å©ãªå ŽåããããŸãããã³ãŒãã®å¯èªæ§ãäœäžããããšããããããŸãã
åã®äŸã
doèšæ³ã§ã©ã®ããã«èŠãããèŠãŠã¿ãŸãããã
-è¡ãèªãã§ããå°å·ããŸãã
readAndPrintLine :: IO ïŒ ïŒ
readAndPrintLine =
ãã
è¡< -getLine
putStrLnè¡
-2è¡ãã€å°å·ããŸãã
-æ©èœã§ã¯ãããŸããã
ãã
putStrLn ãããã¯ã¹ããªã³ã°1ã§ããã
putStrLn ãããã¯æåå2ã§ããã
-è¡ãèªã¿ã2åå°å·ããŸãã
readAndPrintLineTwice :: IO ïŒ ïŒ
readAndPrintLineTwice =
ãã
è¡< -getLine
putStrLnè¡
putStrLnè¡
ããã§ã¯ãã³ãŒãã¯
do -notationã®ãããã§èªã¿ããããªã£ãŠ
ããŸãã èå³æ·±ãããšã«ãããã«ã¯è¿œå ã®å©ç¹ïŒãŸãã¯ãä¿æãããã¥ãŒã«å¿ããŠäžå©ãªç¹ïŒããããŸããHaskellã®ã³ãŒãã¯å¿
é ã«èŠããŸãïŒ ã³ãŒããäžããäžã«èªããšãç¢å°
<-ãå²ãåœãŠã代ããã«åœä»€åèšèªã®ããã«èŠããŸãã
readAndPrintLineã¯æ¬¡ã®ããã«èšè¿°ã§ãããšããŸããããã
getLineãåŒã³åºããŠã
è¡å€æ°ã«å
¥ããè¡ãèªã¿åããŸãã 次ã«ã
putStrLnãåŒã³åºããŠãã®å€æ°ã
åºåããŸãããããã¯ãå®éã«ã¯å®éã«ã¯èµ·ãããŸããïŒããšãã°ã
è¡ã¯å€æ°ã§ã¯ãããŸããïŒãããã®ããã«èªãããšãã§ããŸãã å€ãã®å
¥åºåãè¡ãå€ãã®ã³ãŒãã§ã¯ã
do- abstractã¯éåžžã«äŸ¿å©ãªèšè¿°æ¹æ³ã§ãã
è¡šèšã«ã¯ä»ã®æçšãªããããã£ããããŸãã ããšãã°ã
doè¡šèšã®æ¬æã«letåŒãšcaseåŒãåã蟌ãããšãã§ããŸããããã¯ãã°ãã°äŸ¿å©ã§ãã ããã¯ã«ãŒãã³ã§ããããã詳现ã«ã¯è§ŠããŸãããä»ã®Haskellãã¥ãŒããªã¢ã«ã䜿çšããŠããã®ç¹ã調ã¹ãŠãã ããã
次å
次ã®èšäºã§ã¯ã
Maybe ïŒãšã©ãŒãçºçããå¯èœæ§ã®ããèšç®ã®ã¢ããïŒããå§ãŸãããªã¹ãã¢ããïŒè€æ°ã®çµæã䌎ãèšç®ã®å ŽåïŒã§çµããã¢ããã«ã€ããŠèª¬æããŸãã
å
容
ããŒã1ïŒåºæ¬ããŒã2ïŒé¢æ°>> =ããã³returnããŒã3ïŒã¢ããã®æ³åããŒã4ïŒå€åã¢ãããšãªã¹ãã¢ãã