ã»ãšãã©ã®å Žåãããã¯æééãã«çºè¡ãããæåŸã®éšåã§ãã ç§ã®äŒæã¯ããããçµãããä»ã§ã¯é±ã«èšäºãæžãã®ã¯éåžžã«é£ããã§ãããã Haskell Quest Tutorialã«èå³ãæã£ãŠãããã¹ãŠã®äººã«æè¬ããŸãïŒå±
é
ããªãã¯ãªãã³ã°ã«ãŒã ã«ããŸãã æ±ã«ã¯åºå
¥ãå£ã西ã«ã¯å¥åŠãªãŽã·ãã¯æ§åŒã®æåãæãããæšè£œã®ãã¢ãéããããŠããããã«èŠããããããã£ãŒã±ãŒã¹ãéšå±ã®äžå€®ã«å€§ããªæ±æŽã®æ·ç©ããããŸãã
ãããã£ãŒã±ãŒã¹ã®äžã«ã¯ãå€ãè¯ãæä»£ã®ãšã«ãã®å£ãããã£ãŠããŸãã
ãããã£ãŒã±ãŒã¹ã«ã¯ãããããªãŒé§åã®çé®è£œã©ã³ã¿ã³ããããŸãã
å
容ïŒ
ãããã€ããŒã1-å
ããŒã2-ãã©ã¬ã¹ãããŒã3-ããªã¢ãããŒã4-ãã£ããªã³ã®ãã¥ãŒããŒã5-ããŒã«ããŒã5
ããã§ã¯ãå°ããªãšã©ãŒããéèŠãªçµæãå°ãåºããã²ãŒã ã«ãªããžã§ã¯ãã远å ããŸãã
ãŸããèšæ¶ããªãã¬ãã·ã¥ããŸãããã 4çªç®ã®ããŒãã§ååŸããrun颿°ã«ã€ããŠèŠãŠãããŸãããã ã芧ã®ãšãããç§ã¯ããªãã®ããã«åããŠãLookã¢ã¯ã·ã§ã³ã远å ããŸããã å®è¡æ©èœãå°è±¡çã«ãªããŸããã
curLoc = doãå®è¡ããŸã
putStrLn ïŒ describe curLocãèšè¿°ïŒ
putStr ãã³ãã³ããå
¥åïŒã
x < -getLine
ã®ã±ãŒã¹ ïŒ convertStringToAction x ïŒ
çµäº-> putStrLn ã äŒã ãŸããã...ã
èŠãŠ-> ãã
putStrLn ïŒ describe curLocãèšè¿°ïŒ
curLocãå®è¡ããŸã
Go dir- > do
putStrLn ïŒ " \ n You walking to" ++ show dir ++ "ã \ n " ïŒ
å®è¡ïŒ walk curLoc dir ïŒ
convertResult- > do
putStrLn ïŒ evalAction convertResult ïŒ
putStrLn ãã¿ãŒã³çµäºã \ n "
curLocãå®è¡ããŸã
æåŸã®2çªç®ã®ã¿ã¹ã¯ã§ã¯ããïŒdescribeLocation curLocïŒããžã®2ã€ã®åŒã³åºããåé¿ããæ¹æ³ã«ã€ããŠèããææ¡ããããŸããã ãã¡ããã1ã€ã®å°ããªé¢æ°ã®äŸã䜿çšããŠãªãœãŒã¹ã奪ãåãããã«Näœã®éååé¡ã解決ããããã§ã¯ãããŸãããããã®éèŠæ§ããããã€ãã®éèŠãªçµæãçããŸãã åœä»€åèšèªãããå Žåãçµæã倿°ã«å²ãåœãŠãã ãã§ãã Haskellã§ã¯ãããŒã¿ã¯äžå€ã§ãããšèŠãªãããããããã®ãããªå²ãåœãŠã¯ãããŸããã ãããã倿ããããã«ãå²ãåœãŠãäžè¬åããã ãã§ãªãã倿ŽãããŠããªãç¶æ
ãèæ
®ããŠãè峿·±ã广ãããããä»ã®ã¡ã«ããºã ããããŸãã ããšãã°ãå®è¡ã®æ±ºå®è«ã å®éãã°ããŒãã«ãªç¶æ
ã颿°ã«åœ±é¿ããããã®å
éšã§ããŒã¿ãæããã«å€æŽãããŠããªãå ŽåãåãåŒæ°ã«åãå€ãè¿ãããšãæå³ããŸãã 颿°ã1ååŒã³åºãããšã§ããã©ã¡ãŒã¿ãŒãšçµæãèšæ¶ã§ããŸããåããã©ã¡ãŒã¿ãŒã§2ååŒã³åºãå¿
èŠãããå Žåã¯ãåã«èšç®ããçµæãåçŽã«è¿ããŸãã
ããããããžãã¹ã«åãããããŸãããã ç§ãã¡ã®åé¡ã«ã¯ããã€ãã®è§£æ±ºçããããŸãã ãŸããgetLineããã®è¡ãšå€æ°xãæ¥ç¶ããã®ãšåãæ¹æ³ã§ãçµæã倿°ã«é¢é£ä»ããŠã¿ãŸãã ããã¯å²ãåœãŠã«äŒŒãŠãããããã§ã®èãæ¹ã¯ç°¡åã§ããå¿
èŠãªã ã倿°ã䜿çšã§ããŸãã æåã®åŒã³åºããããããããæ¬¡ã®ã³ãŒããååŸããŸãã
curLoc = doãå®è¡ããŸã
locDescr < -describeLocation curLoc
putStrLn locDescr
putStr ãã³ãã³ããå
¥åïŒã
x < -getLine
ã®ã±ãŒã¹ ïŒ convertStringToAction x ïŒ
...- æ®ãã®ã³ãŒã
ãããããã®ã³ãŒãã¯ã³ã³ãã€ã«ãããªããããããªãã¯ã§ãã
*ã¡ã€ã³> ïŒr
[ 2 of 2 ] Mainã®ã³ã³ãã€ã«ïŒ HïŒ\ Haskell \ QuestTutorial \ Quest \ QuestMainãHs ãè§£éæžã¿ïŒ
HïŒ\ Haskell \ QuestTutorial \ Quest \ QuestMain hsïŒ 58 ïŒ 17 ïŒ
äºæãããã¿ã€ã ' [ a0 ] 'ãå®éã®ã¿ã€ã ' IO ïŒ ïŒ 'ãšäžèŽãããããšãã§ããŸããã§ãã
' putStrLn 'ã®åŒã³åºãã®æ»ã å
ã do ãåŒã®æ ïŒ putStrLn locDescr
åŒã§ã¯ïŒ
...
倱æããŸãããã¢ãžã¥ãŒã«ãããŒããããŸããïŒTypes ã
ãx <-getLineããšãlocDescr <-describeLocation curLocãã®éãã¯äœã§ããïŒ åãããšã®ããã§ãïŒgetLine颿°ã¯ã倿°xã«é¢é£ä»ããããæååãè¿ããŸãã ãŸãã颿°ïŒdescribeLocation curLocïŒã¯ãå¥ã®locDescr倿°ã«ãã€ã³ãããæååãè¿ããŸãã ããããã€ã³ã¿ãŒããªã¿ãŒã¯ããã€ãã®ã¿ã€ããäžèŽããªããšèšããŸãã ç¶æ³ãèŠãŠã¿ãŸãããããããŠããã®ããã«ã¯ãrun颿°ã§å®éã«äœãèµ·ããããçè§£ããå¿
èŠããããŸãã
ãšã©ãŒã®ããè¡ãã³ã¡ã³ãã¢ãŠãããŠãäœæ¥ã³ãŒãã«æ»ããŸãããã
curLoc = doãå®è¡ããŸã
-locDescr <-describeLocation curLoc
-putStrLn locDescr
putStr ãã³ãã³ããå
¥åïŒã
x < -getLine
ã®ã±ãŒã¹ ïŒ convertStringToAction x ïŒ
...- æ®ãã®ã³ãŒã
*ã¿ã€ã> ïŒr
[ 2 of 2 ] Mainã®ã³ã³ãã€ã«ïŒ HïŒ\ Haskell \ QuestTutorial \ Quest \ QuestMainãHs ãè§£éæžã¿ïŒ
OK ãããŒããããã¢ãžã¥ãŒã«ïŒMain ã Types ã
*ã¡ã€ã³>
ãã®ã¿ã€ãã®è€éãã«å
¥ããªãããã«ãæå³çã«run颿°ã®å®çŸ©ãäœæããŸããã§ããã ãããã圌女ã«ã¯åããããã³ã³ãã€ã©ãŒã¯èªåã§ãããå¿ å®ã«è¡šç€ºããŸãã ãã§ãã¯ïŒ
*ã¡ã€ã³> ïŒå®è¡
å®è¡::ãã±ãŒã·ã§ã³-> IO ïŒ ïŒ
ãããŠãããã§é©ããåŸ
ã£ãŠããŸãã Locationã¯åäžã®ãã©ã¡ãŒã¿ãŒã®åã§ãããå¥åŠãªåIOïŒïŒã®å Žåãæ»ãå€ã®å以å€ã¯äœããããŸããã ãšãŠãé¢çœãïŒ çµå±ã®ãšãããã©ãã§ãIOïŒïŒã䜿çšããŠããŸãããã©ãããæ¥ãã®ã§ããïŒ Haskellã®æãè¡çºãšææ§ã®ããã§ãã§ã«Haskellã責ããããšããŠããå Žåã¯ãæ¥ããªãã§ãã ããã å®éã«ã¯ãHaskellã«ãããšãå
¥åºåïŒI / OïŒã¢ã¯ã·ã§ã³ã¯æœåšçãªãšã©ãŒããã³é害ã§ããããå¯äœçšããšããŠãç¥ãããŠããŸãã ãããã£ãŠãå
¥åºå颿°ïŒputStrLnãputStrãputCharãgetLineãgetCharãreadFileãwriteFileïŒã¯å±éºã§ãããåãåŒæ°ã«ç°ãªãçµæãè¿ãããšããããå Žåã«ãã£ãŠã¯ãšã©ãŒãã¹ããŒããããšãããããŸãã ãããã£ãŠããããã¯IOåã§ãããèšèªã®èгç¹ã§ã¯ãç§ãã¡ã«é¢ä¿ããã¯ãã§ãã ããã«ãå
éšã«IOã¿ã€ããæã€ä»ã®ãã¹ãŠã®é¢æ°ãéæ±ºå®æ§ã«ãªããæ¡çšããå¿
èŠããããŸãã run颿°ã¯å®å
šã§ãªãã¢ã¯ã·ã§ã³ãéžæãããããIOïŒïŒã¿ã€ãã«ææããŸããã ã¡ãªã¿ã«ãããã°ã©ã ãžã®ãšã³ããªãã€ã³ãïŒã¡ã€ã³é¢æ°ïŒã¯ãrunãåŒã³åºãããããããã®éåœãéããŸããã§ããã
* Main > ïŒt main
ã¡ã€ã³:: IO ïŒ ïŒ
å
¬å¹³ã«èšãã°ã説æã§ã¯IOã¢ã¯ã·ã§ã³ã䌎ã颿°ã¯é決å®çã§ãããšããä»®å®ããªãããŠãããšèšã䟡å€ããããŸãã å®éãããã¯å®å
šã«çå®ã§ã¯ãããŸããã ããæå³ã§ãã®ãããªé¢æ°ã¯æ±ºå®è«çã§ãããçŽç²ã§ãããããŸãã ãã®è³ªåã¯ãäžè¬çã«èšãã°ãHaskellã®çŽåºŠã«é¢ããè°è«ã®ã€ãŸããã®ãããã¯ã§ããããã®è°è«ã¯ã€ã³ã¿ãŒãããã§èŠã€ããããšãã§ããŸãã
äžèšã¯ç§ãã¡ã®åé¡ã«ã©ã®ããã«é¢ä¿ããŠããŸããïŒ ééã£ãã³ãŒããïŒã³ã³ãã€ã«ããã«ïŒããäžåºŠèŠãŠã¿ãŸããããå®è¡é¢æ°ã®å®çŸ©ãé çªã«å²ãåœãŠãŸãã
å®è¡::ãã±ãŒã·ã§ã³-> IO ïŒ ïŒ
curLoc = doãå®è¡ããŸã
locDescr < -describeLocation curLoc
putStrLn locDescr
putStr ãã³ãã³ããå
¥åïŒã
x < -getLine
ã®ã±ãŒã¹ ïŒ convertStringToAction x ïŒ
...- æ®ãã®ã³ãŒã
ç¥ã£ãŠããããã«ãdoããŒã¯ãŒãã¯ã¢ã¯ã·ã§ã³ããã§ãŒã³ã«ãªã³ã¯ããŸããããã§ãŒã³ã«ã¯ãªã³ã¯ããŸããã do-notationã§ã¯ããã§ãŒã³å
ã®ãã¹ãŠã®ã¢ã¯ã·ã§ã³ãåãåãè¿ãå¿
èŠããããŸãã I / Oã§äœæ¥ããããã颿°ã®ã¿ã€ãã«ã¯IOãå«ãŸããŠããå¿
èŠããããŸãã
*ã¡ã€ã³> ïŒt putStrLn
putStrLn :: æåå -> IO ïŒ ïŒ
* Main > ïŒt putStr
putStr :: æåå -> IO ïŒ ïŒ
Stringåã®åŒæ°ã«å ããŠããããã®2ã€ã®é¢æ°ã¯åãæ»ãå€å-IOïŒïŒãæã£ãŠããŸãã ããã§ã®ç©ºã®æ¬åŒ§ã¯ãæçšãªãã®ãäœãè¿ãããªãããšã瀺ããŸãã å®éãã³ã³ãœãŒã«ã«åŒæ°ãåºåããã ãã§ããã°ãputStrLnãäœãè¿ããã¯é¢ä¿ãããŸããã ããã©ããããgetLine颿°ã«ã¯ãæçšãªãäœããæåŸ
ãããŸãããããã¯ç¬èªã®æ¹æ³ã§ãã®ã¿ã€ãã«åæ ãããŸãã
* Main > ïŒt getLine
getLine :: IO æåå
getLineã¯ãŠãŒã¶ãŒããæååãåãåãããããã®ãããšããŠIOã¿ã€ãã«ããã¯ããŸãã ãããŠãããªããã®ããã§äœã§ããããã§ãã ããšãã°ãconvertStringToAction颿°ã«æž¡ããŸãã
...
x < -getLine
ã®ã±ãŒã¹ ïŒ convertStringToAction x ïŒ
...
ããããconvertStringToAction颿°ã«ã¯ç°ãªãåããããŸãïŒ -ããªããå«ã³ãããªãã¯æ£ããã§ãããã 圌女ã¯IO Stringã§ã¯ãªããå
¥åã§StringãåŸ
ã£ãŠããŸãïŒ ããªãã¯ã¯äœã§ããïŒ ããŠããããã®2è¡ã®ã©ããã§ã®ãããå±éãããIOããã¯ã¹ã¯æšãŠããã空çœè¡ã¯ãã§ã«é²ãã§ããŸãã ãããŠãããã¯ç¢å°ã«ãã£ãŠè¡ãããŸãã ããã¯ãããçµæãå³åŽããååŸããå·ŠåŽã®å€æ°ã«ã¢ã³ããã¯ããŸãã ãšããã§ããã®æäœã¯å²ãåœãŠã§ã¯ãªããã€ã³ãã£ã³ã°ãšåŒã°ããŸãã èããŠã¿ããšãå³åŽã®ã©ãã«ãäœãè©°ã蟌ãŸããŠããªãããããlocDescr <-describeLocation curLocããšãã衚çŸã¯ééã£ãŠããŸããèªã¿åããçµæã¯IOããã¯ã¹ã«å
¥ããããŸããã
* Main > ïŒt ïŒãã±ãŒã·ã§ã³ããŒã ã®èª¬æïŒ
ïŒ describeLocationããŒã ïŒ :: æåå
ããŠãããã«ãããŸã...ã§ããã ãã·ã³ãã«ã«ãããã£ãã®ã§ãããå€ãã®ããŒãžãã©ã®ãããªçµæããããããŸããã ããããç§ã¯ããªãã«æå ±ããããŸãïŒè§£æ±ºçããããŸãïŒ ç§ãã¡èªèº«ãå³åŽã«ãããã®ãã¿ã€ãIOã«è©°ã蟌ã¿ãç¢å°ãçªæ¯ãããŸãã ããã«ã¯æ»ã颿°ããããŸãã æ¬¡ã®ã³ãŒãã¯æå³ãããšããã«æ©èœããŸãã
å®è¡::ãã±ãŒã·ã§ã³-> IO ïŒ ïŒ
curLoc = doãå®è¡ããŸã
locDescr < -return ïŒ describeLocation curLoc ïŒ
putStrLn locDescr
putStr ãã³ãã³ããå
¥åïŒã
x < -getLine
ã®ã±ãŒã¹ ïŒ convertStringToAction x ïŒ
çµäº-> putStrLn ã äŒã ãŸããã...ã
èŠãŠ-> ãã
putStrLn locDescr
curLocãå®è¡ããŸã
...- æ®ãã®ã³ãŒã
ã¯ããæ»ã颿°ã¯æååãdoïŒIOïŒãããã¯ã¿ã€ãã«ããã¯ããç¢å°ã¯ãããã¢ã³ããã¯ããŠlocDescr倿°ã«é¢é£ä»ããŸãã ãŸããå Žæã®èª¬æãäœåºŠãèšç®ããå¿
èŠããªããªããŸããã ãã¡ãããè«çã¯çããã§ãããããªãã¯åæããå¿
èŠããããŸãïŒããã«ã¯äœããã®å
é¢çãªçŸããããããŸãã 飲ã䟡å€ããïŒ
IOã®è¡šèšæ³ãšã¿ã€ãã«ã¯ãããã«å€ãã®çµæãšèœãšã穎ããããŸãã ããæ·±ãæãäžãããšãå¯äœçšã ãã§ãªããIOã¢ã¯ã·ã§ã³ãšã¯ç°ãªãæ³åã«åŸã£ãŠé¢é£ä»ããããšãã§ããä»ã®å€ãã®èšç®ããæ®éçãªæ¹æ³ã§èª¿æŽã§ããŸãã ããããã¢ããã䜿çšããŠèšç®ãè¡ããšãé©ãã»ã©ã·ã³ãã«ã§äŸ¿å©ãªããžãã¯ã«ãªããã³ãŒãã¯ç°¡æœã§çè§£ããããã衚çŸåã«ãªããŸãã ãã®ãããªã³ãŒãã¯å³å¯ã«æ°åŠçã§éåžžã«äŸ¿å©ã§ããããšãéèŠã§ãã è§£æãDSLãå¯å€ç¶æ
ãªã©ãç¹å®ã®ã¿ã¹ã¯ãèšè¿°ããã®ã«éåžžã«é©ããŠããŸãã ãããããã€ããã®ãããã¯ã«æ»ããŸããããããå®éã«å¿
èŠã«ãªãã®ã¯ãã以åã§ãã
ããŠãç§ãã¡ã¯åé¡ã解決ããŸããã ã§ã¯ããªãä»ã®è§£æ±ºçãèãåºãå¿
èŠãããã®ã§ããããïŒ ã¯ããäžè¬çã«ã¯ãåãããšã§ããHaskellã«ã€ããŠäœãä»ã®ããšãåŠã¶ããšã§ãã
次ã®ãœãªã¥ãŒã·ã§ã³ã§ã¯ãwhereã³ã³ã¹ãã©ã¯ãã䜿çšããŸãã ããã¯ãããã§ã®ã¿å©çšå¯èœãªé¢æ°ãèšè¿°ããããšãã§ããç¹å¥ãªæ§é ã§ã-ä»ã®ããã°ã©ãã³ã°èšèªã®å
¥ãå颿°ã®ããã«ã whereãããã¯å
ã§ã¯ãèŠªé¢æ°ã®å€æ°ã䜿çšå¯èœã§ãããéåžžã®é¢æ°ã«é©çšããããã¹ãŠã®æ³åãé©çšãããŸãã ã€ãŸããåã颿°ã®è€æ°ã®ããªã¢ã³ããäœæãããã¿ãŒã³ãããã³ã°ãã»ãã¥ãªãã£åŒã䜿çšããããã«ãã¹ããããwhere-constructionãäœæã§ããŸãã
æ§é ãç¹å¥ãªèª¬æãå¿
èŠãšããªãå ŽåãäŸãèŠãŠãã ããïŒ
å®è¡::ãã±ãŒã·ã§ã³-> IO ïŒ ïŒ
curLoc = doãå®è¡ããŸã
putStrLn locDescr
putStr ãã³ãã³ããå
¥åïŒã
x < -getLine
ã®ã±ãŒã¹ ïŒ convertStringToAction x ïŒ
çµäº-> putStrLn ã äŒã ãŸããã...ã
èŠãŠ-> ãã
putStrLn locDescr
curLocãå®è¡ããŸã
...- æ®ãã®ã³ãŒã
ã©ãã§
locDescr = describeLocation curLoc
whereãããã¯ã®åã«doãããã¯ãšåãã€ã³ãã³ããäœæããŸããã åºæ¬çã«ããã®ãããã¯ã®å Žæãå®çŸ©ããŸããã çµæã倿°locDescrã«å²ãåœãŠãŠããããã«èŠãããããããŸããããããã§ã¯ãããŸããã ããã«ã¯å€æ°ãšå²ãåœãŠã¯ãããŸããã locDescrã¯ãå Žæã®èª¬æãè¿ã颿°ã§ãã ãã®é¢æ°ã芪ã³ãŒããã2ååŒã³åºããŸãã ãã ããã»ãšãã©ã®å ŽåãäžåºŠã ãèšç®ãããŸãã Haskellã³ã³ãã€ã©ã¯ãéå»ã®çµæãåå©çšã®ããã«ä¿æã§ããŸãã ããŒã¿ãäžèŠã«ãªããšãçµã¿èŸŒã¿ã®ã¬ããŒãžã³ã¬ã¯ã¿ãŒã«ãã£ãŠåé€ãããŸãã ãã£ããããæ°ãèšç®ãããæåŸã®éšåã®ãµã€ãããŒãæãåºããŠãã ããã ååž°ã®åã¹ãããã§å€ãæåããèšç®ãããå Žåãããã°ã©ã ã¯ã©ã®ããã«æ©èœããŸããïŒ
æåŸã«ãæåŸã®è§£æ±ºç-ããããletåŒ-ãæãåçŽã§ãããããããã§æãé©åã§ãã ãŸããletåŒã¯whereãšéåžžã«äŒŒãŠããŸãããåŒã®ãšã€ãªã¢ã¹ãå®çŸ©ããŸããããã®ãããªååã®é¢æ°ã¯å®çŸ©ããŸããã doãããã¯å
ã§ã¯ãletåŒã¯æ¬¡ã®ããã«ãªããŸãã
å®è¡::ãã±ãŒã·ã§ã³-> IO ïŒ ïŒ
curLoc = doãå®è¡ããŸã
let locDescr = describeLocation curLoc
putStrLn locDescr
putStr ãã³ãã³ããå
¥åïŒã
x < -getLine
ã®ã±ãŒã¹ ïŒ convertStringToAction x ïŒ
çµäº-> putStrLn ã äŒã ãŸããã...ã
èŠãŠ-> ãã
putStrLn locDescr
curLocãå®è¡ããŸã
...- æ®ãã®ã³ãŒã
doãããã¯ã®å€åŽãããšãã°ä»ã®åŒã®å
åŽã§letåŒã䜿çšãããšãã¬ã³ãŒãã¯ãããã«å€ãããŸãã inããŒã¯ãŒãã远å ãããŸãã
å®è¡::ãã±ãŒã·ã§ã³-> IO ïŒ ïŒ
curLoc =ãå®è¡ããŸã
let locDescr = describeLocation curLoc in
ãã
putStrLn locDescr
putStr ãã³ãã³ããå
¥åïŒã
x < -getLine
ã®ã±ãŒã¹ ïŒ convertStringToAction x ïŒ
çµäº-> putStrLn ã äŒã ãŸããã...ã
èŠãŠ-> ãã
putStrLn locDescr
curLocãå®è¡ããŸã
...- æ®ãã®ã³ãŒã
å®éãletãšinã®éã«ãã®ãããªåŒãããã€ã§ãå®çŸ©ã§ããŸãããªããžã§ã¯ãã®è¿œå ã«é²ããšããããã©ã®ããã«è¡ãããããããããŸãã ãããŸã§ã¯ãletåŒãdoãããã¯å
ã«ããåã®ãªãã·ã§ã³ããã®ãŸãŸã«ããŸãã
LetåŒã¯çãæžãããŠããã ãã§ãªããããã€ãã®ç¹å¥ãªå Žåã«äœ¿çšã§ãããããåªããŠããŸãã ãã®ãããããšãã°ãåãç®çã§ãªã¹ãå
å
衚èšã«letãæ¿å
¥ã§ããŸããã¹ã³ãŒããå¶éããŠåŒãå®çŸ©ããŸãã ãã ããæ¬ ç¹ãããå Žæãšæ¯èŒããŠãã¬ãŒãåŒãšãã¿ãŒã³ãããã³ã°ã䜿çšããããšã¯ã§ããŸããã ãã¡ãããç§ãã¡ã¯ä»®åãå®çŸ©ããŠããã®ã§ããã®ç¯å²å
ã§ããããç¹°ãè¿ãã¹ãã§ã¯ãããŸããã
ãªããžã§ã¯ãã«å°éãããšãã«å°ããŸããïŒ ç§ã¯ãã§ã«åãæ¿ããŠããŸãã ããªãã¯ãŸã ã§ããïŒ ãã®åŸã远ãã€ãã æ¬¡ã®ããã«ããªããžã§ã¯ãã®ADTã¿ã€ããäœæããŸãã
ããŒã¿ãªããžã§ã¯ã=ããŒãã«
| å
| åŒãåºã
| é»è©±çªå·
| ã¡ãŒã«ããã¯ã¹
| ãã¬ã³ãããŒ
å°åº ïŒ Eq ã Show ã Read ïŒ
å Žæã®ç»åã«ããªããžã§ã¯ãã®èª¬æãå«ã颿°ã远å ããŸãã
describeObject :: Object- > String
describeObject Umbrella = "çŽ æµãªèµ€ãã¡ã«ããã¯ã®åã"
describeObject Table = "åŒãåºãä»ãã®è¯ãæšè£œããŒãã«ã"
describeObject Phone = "é»è©±ã«ã¯é³å£°ã¡ãã»ãŒãžããããŸãã"
describeObject MailBox = "ã¡ãŒã«ããã¯ã¹ãéããŠããŸãã"
describeObject obj = "ç¹å¥ãªããšã¯äœããããŸãã" ++ show obj
ããªãã¯ã¯ãããŸãããç§ãã¡ã¯ãã§ã«ããããã¹ãŠç¥ã£ãŠãããç§ãã¡ã¯ã§ããã®ã§ãã æ°ãããªããžã§ã¯ãã¯ãå Žæã®ãªããžã§ã¯ããå®çŸ©ããå¿
èŠããããšãã«å§ãŸããŸãã ãã¡ããããã¹ãŠã®æºåãæŽãããã€ã¯ã¢ã³ãããããã¢ã¯ã·ã§ã³ãæ©èœããã€ã³ãã³ããªãè€åãªããžã§ã¯ãããã£ãããšãæã¿ãŸã...ããããããã¯èµ·ãããŸããã æ¬¡ã«ããªããžã§ã¯ãã®ãã©ããããŒãžã§ã³ãäœæãŸãã¯ã¹ããŒã§ããªãå Žæã§äœæããããã«åºã¥ããŠä»ã®ããé«åºŠã§é©åãªã¡ã«ããºã ãèããŸãã
ã²ãŒã ãå§ãŸãããŒã ã®å Žæã«ããã€ãã®ãªããžã§ã¯ããããããã®äžã«ããŒãã«ãããŒãã«åŒãåºããé»è©±ãåããããšä»®å®ããŸãã ãã®å Žæã®ãªããžã§ã¯ãã®ãªã¹ããè¿ãlocationObjects颿°ãèšå®ããŸãã
locationObjects ::å Žæ-> [ãªããžã§ã¯ã]
locationObjectsããŒã = [åãåŒãåºããé»è©±ãããŒãã«]
locationObjects _ = [ ]
äžè¬çã«ããªã¹ãã¯ã·ã³ãã«ã«èŠããŸãã ãªããžã§ã¯ãã®ãªã¹ãã¯[ãªããžã§ã¯ã]ã®äžçš®ã§ãã ããŒã ã®å Žæã«ã€ããŠã¯ã4ã€ã®ãªããžã§ã¯ãã®ãªã¹ããè¿ããŸãã 空ã®ãªã¹ãã¯ãä»ã®ãã¹ãŠã®å Žæã«ãªããžã§ã¯ãããªãéãã空ã®è§æ¬åŒ§ã§ç€ºãããŸãã å
ã«é²ãåã«ã³ãŒãããã¹ããã䟡å€ããããŸãã
*ã¡ã€ã³> locationObjectsããŒã
[åãåŒãåºãã Phome ãããŒãã«]
* Main > locationObjects Garden
[ ]
*ã¡ã€ã³> describeObjectããŒãã«
ãåŒãåºãä»ãã®è¯ãæšè£œããŒãã«ãã
Objectåã¯Showåã¯ã©ã¹ããç¶æ¿ããããããshow颿°ã¯åã³ã³ã¹ãã©ã¯ã¿ãŒã ãã§ãªãããã®åã®ãªã¹ãã«ã䜿çšã§ããŸãã
*ã¡ã€ã³>åã衚瀺
å
*ã¡ã€ã³> ã·ã§ãŒ [åãããŒãã«]
ã[åãããŒãã«]ã
* Main > show ïŒ locationObjects Home ïŒ
ã[åãåŒãåºããé»è©±ãããŒãã«]ã
* Main > putStrLn ïŒ show ïŒ locationObjects Home ïŒ ïŒ
[åãåŒãåºããé»è©±ãããŒãã«]
éããŸãçã§ãã èªã¿åã颿°ã§ãªã¹ãé
ç®ãè§£æã§ããå Žåããªã¹ãå
šäœãè§£æã§ããŸãã
* Main > read "[TableãMailBox]" :: [ Object ]
[衚ãã¡ãŒã«ããã¯ã¹]
æ§æãçè§£ã§ããã®ã§ãçŸåšã®å Žæã«ã€ããŠèª¬æã衚瀺ãããã ãã§ãªããããã«ãããªããžã§ã¯ãã®ãªã¹ããå°å·ãããããã«æ§æãäœæããŸãã letåŒã䜿çšããŠã¿ãŸãããã
curLoc = doãå®è¡ããŸã
let locDescr = describeLocation curLoc
let objectsDescr = " \ nããã«ã¯ããã€ãã®ãªããžã§ã¯ãããããŸãïŒ" ++ show ïŒ locationObjects curLoc ïŒ
let fullDescr = locDescr ++ objectsDescr
putStrLn fullDescr
...- æ®ãã®ã³ãŒãã¯ãLookã¢ã¯ã·ã§ã³ãæŽæ°ããããšãå¿ããªãã§ãã ããã
ããã°ã©ã ã®åºåã¯æ¬¡ã®ããã«ãªããŸãã
*ã¡ã€ã³>ã¡ã€ã³
Haskellã§ã®ã¯ãšã¹ãã¢ããã³ãã£ãŒã
ããŒã
ããªãã¯æšè£œã®ããŒãã«ã®çãäžã®éšå±ã«ç«ã£ãŠããŸãã
ããã«ã¯ããã€ãã®ãªããžã§ã¯ãããããŸãïŒ [åãåŒãåºããé»è©±ãããŒãã«]
ã³ãã³ããå
¥åããŠãã ããïŒ
ã³ãŒãã«ã¯å°ãé¢åã§ãã ãã®å Žæã«ãªããžã§ã¯ãããªããŠãããããã«ã¯ãªããžã§ã¯ããããã€ããããŸãããšããç¢æã¯ããŸã ç®éãã§ãã
ã³ãã³ããå
¥åïŒGo North
åãžæ©ããŠããŸãã
åº
ããªãã¯åºã«ããŸãã .....
ããã«ã¯ããã€ãã®ãªããžã§ã¯ãããããŸãïŒ [ ]
ã³ãã³ããå
¥åããŠãã ããïŒ
ãªããžã§ã¯ãã®ç©ºã®ãªã¹ãã«å¯ŸããŠè¡šç€ºããªãããã«ããªããžã§ã¯ããèšè¿°ããããã®ãã¹ãŠã®ã³ãŒããå¥ã®é¢æ°ã«å
¥ããenumerateObjectsãšåŒã³ãŸãã å
¥åã§ã¯ãªã¹ããåãåããåºåã§ã¯ãªã¹ãããããªããžã§ã¯ããå«ãæååãæž¡ããŸãã
enumerateObjects :: [ãªããžã§ã¯ã] -> æåå
enumerateObjects [ ] = ""
enumerateObjects objects = " \ nããã«ã¯ããã€ãã®ãªããžã§ã¯ãããããŸãïŒ" ++ãªããžã§ã¯ãã衚瀺
enumerateObjects颿°ã®æåã®ããªã¢ã³ãã¯ç©ºã®æååãè¿ããŸããã転éããããªããžã§ã¯ãã®ãªã¹ãã空ã®å Žåã®ã¿ã§ãã 空ã§ãªãå Žåãæåã®ãªãã·ã§ã³ã¯æåŠããã2çªç®ã®ãªãã·ã§ã³ãæ©èœããŸãã å®è¡æ©èœïŒ
curLoc = doãå®è¡ããŸã
let locDescr = describeLocation curLoc
let objectsDescr = enumerateObjects ïŒ locationObjects curLoc ïŒ
let fullDescr = locDescr ++ objectsDescr
putStrLn fullDescr
... -...
ãŸãã¯ãå¿
èŠã«å¿ããŠãdoãããã¯ããletåŒãåŒãåºãããšãã§ããŸãã
curLoc =ãå®è¡ããŸã
ããã
locDescr = describeLocation curLoc
objectsDescr = enumerateObjects ïŒ locationObjects curLoc ïŒ
fullDescr = locDescr ++ objectsDescr
ãã
putStrLn fullDescr
... -...
ãã®åçŽãªãªãã¡ã¯ã¿ãªã³ã°ã®ãããã§ãå®è¡ã«åœ±é¿ãäžããã«enumerateObjects颿°ã倿Žã§ããããã«ãªããŸããã ãããã£ãŠããªããžã§ã¯ããåæããã ãã§ãªãããªããžã§ã¯ãã®èª¬æã衚瀺ãããã®ã§ãéã³å¿ã®ãããã³ã§enumerateObjectsã«ã¢ã¯ã»ã¹ããŠãããã«ããäœããä¿®æ£ããŸããã ããããã©ããããããåŸã§ã 次ã«ãã«ã¹ã¿ã ã¢ã¯ã·ã§ã³Investigateã远å ããŸãããã ãã®ã³ãã³ãã«ãããããã°ã©ã ã¯ãªããžã§ã¯ãã®è©³çްãªèª¬æãæäŸããå¿
èŠããããŸãã ãŠãŒã¶ãŒã次ã®ããã«å
¥åããå¿
èŠãããããšã¯æããã§ãã
ã³ãã³ããå
¥åïŒåã®èª¿æ»
ãInvestigate Umbrellaããšããè¡ãè§£æããå¿
èŠããããŸãã ããªãã¿ã§ããïŒ æ¢ã«GoããŒã ã§ãããè¡ã£ãŠããŸãã ããã§ãåãã§ããInvestigateã³ã³ã¹ãã©ã¯ã¿ãŒã«Objectãã©ã¡ãŒã¿ãŒãé
眮ããã ãã§ãã
ããŒã¿ã¢ã¯ã·ã§ã³=
...
| ãªããžã§ã¯ãã調æ»ãã
...
ã»ãã®å°ãã ã-å®è¡æ©èœãä¿®æ£ããã«ã¯ïŒ
curLoc = doãå®è¡ããŸã
...
...
ã®ã±ãŒã¹ ïŒ convertStringToAction x ïŒ
objã調æ»ãã-> do
putStrLn ïŒ describeObject obj ïŒ
curLocãå®è¡ããŸã
...
ãããŠåºæ¥äžããïŒ å¥ã®ãŠãŒã¶ãŒã¢ã¯ã·ã§ã³ãå®è£
ããŸããïŒ ããã§ãšãããããŸãïŒ ã³ãã³ããInvestigate Umbrellaããå
¥åãããšãããã°ã©ã ã«ãNice red mechanic Umbrellaããšããæååã衚瀺ãããããšã確èªã§ããŸãã
ããã ãã§ã...ç§ãã¡ã®æªããšãããç¥ã£ãŠããŸããïŒ ããŒã ã®å Žæã§ãInvestigate MailBoxãã³ãã³ããå
¥åãããšãã¡ãŒã«ããã¯ã¹ã®èª¬æã衚瀺ãããŸãããããããã¯ãŸã£ããèŠããŸããïŒ ããã§ã¯ããªããžã§ã¯ããèŠã€ãã£ãå Žåã«Trueãè¿ãisVisible颿°ãèããŸãããã®å Žåã®ã¿ããªããžã§ã¯ãã®èª¬æãçºè¡ããŸãã isVisible颿°ã®åŒæ°ã¯äœã§ããïŒ èª¿æ»å¯Ÿè±¡ã®ãªããžã§ã¯ããšããã¹ãŠã®ãã±ãŒã·ã§ã³ãªããžã§ã¯ãã®ãªã¹ããå¿
èŠã§ãã ãã®ãããªãã®ïŒ
isVisible ::ãªããžã§ã¯ã-> [ãªããžã§ã¯ã] -> Bool
ãã®ãªã¹ãã«ãªããžã§ã¯ãããããã©ãããã©ãã«ãããŠèª¿ã¹ãå¿
èŠããããŸãã ãªã¹ãå
ã®ãã¹ãŠã®ãªããžã§ã¯ããåæãããæããªããªãã·ã§ã³ã¯èããããŸããããããã¯éåžžã«å¯èœã§ãããæšæºã®elem颿°ã䜿çšããã ãã§ãã èŠçŽ ãšãªã¹ãã®2ã€ã®ãã©ã¡ãŒã¿ãŒãåããŸãã ãªã¹ãå
ã«ã¢ã€ãã ãèŠã€ãã£ãå ŽåãTrueãè¿ããŸãã å¿
èŠãªãã®ïŒ
isVisible ::ãªããžã§ã¯ã-> [ãªããžã§ã¯ã] -> Bool
isVisible objãªããžã§ã¯ã= elem objãªããžã§ã¯ã
Haskellã«ã¯ç¹å¥ãªè¡šèšæ³ãããã颿°ãåŒæ°ã®éã«é
眮ããŸã-æå³ã®æç¢ºããšéææ§ãé«ããŸãã ãããè¡ãã«ã¯ã颿°ãéã¢ãã¹ãããã£ããã¿ã³äžã«ãããã®ã§å²ãå¿
èŠããããŸãã
isVisible ' ::ãªããžã§ã¯ã-> [ãªããžã§ã¯ã] -> Bool
isVisible 'obj objects = obj ` elem`ãªããžã§ã¯ã
ããããåãæ©èœã®ããã ãããŒãžã§ã³ã ãããã®äžã§ããªã¹ãå
ã®ãªããžã§ã¯ããæåã§æ¢ããŸãã
isVisible '' ::ãªããžã§ã¯ã-> [ãªããžã§ã¯ã] -> Bool
isVisible '' obj [ ] = False
isVisible '' obj ïŒ oïŒos ïŒ = ïŒ obj == o ïŒ || ïŒ isVisible '' obj os ïŒ
isVisible '' ' ::ãªããžã§ã¯ã-> [ãªããžã§ã¯ã] -> Bool
isVisible '' 'obj [ ] = False
isVisible '' 'objãªããžã§ã¯ã= ïŒ obj == ããããªããžã§ã¯ãïŒ || ïŒ isVisible '' 'obj ïŒ ããŒã«ãªããžã§ã¯ãïŒ ïŒ
ãããã¯åãããã«æ©èœããéãã¯äœ¿çšããææ®µã®ã¿ã§ãã ãããšããã®äž¡æ¹ã§ããªã¹ãã¯éšåã«åå²ãããŸãïŒæ®ãã®èŠçŽ ã®ãããèŠçŽ ãšããŒã«ã æåã®äŸã§ã¯ããªã¹ãã¯ãšã³ããªïŒoïŒosïŒã䜿çšããŠåå²ãããŸãã 倿°ãoãã«ã¯ããããå«ãŸãã倿°ãosãã«ã¯ä»ã®ãã¹ãŠãå«ãŸããŠããããšã¯æããã§ãã 2çªç®ã®äŸã§ã¯ãããããªã¹ããšããŒã«ãªã¹ãã®äžã®çµã¿èŸŒã¿é¢æ°ã§ã®ã¿åãããšãè¡ããŸãã æ¬¡ã«ããªããžã§ã¯ããheadèŠçŽ ãšäžèŽãããã©ããã確èªããäžèŽããªãå Žåã¯ãæ®ãã®èŠçŽ ã«å¯ŸããŠisVisibleãååž°çã«åŒã³åºããŸãã ååž°ãç¡éã«ãªããªãããã«ããããã«ã颿°ãisVisible obj [] = Falseãã®ããªã¢ã³ãã远å ããŸããããªã¹ãã®ãã¹ãŠã®èŠçŽ ãçªç¶åãã§ãäœãæ®ã£ãŠããªãå Žåã«æ©èœããŸãã
ããŠãæ®ã£ãŠããã®ã¯ãã®æ©èœã䜿çšããããšã ãã§ãã ãã€ãã®ããã«ãrunã倿ŽããçŸåšã®å Žæã®ãªããžã§ã¯ããæ°åèŠæ±ããªãããã«ãããããletåŒã«å
¥ããŸãã
curLoc = doãå®è¡ããŸã
let locObjects = locationObjects curLoc
let locDescr = describeLocation curLoc
let objectsDescr = enumerateObjects locObjects
let fullDescr = locDescr ++ objectsDescr
putStrLn fullDescr
putStr ãã³ãã³ããå
¥åïŒã
x < -getLine
ã®ã±ãŒã¹ ïŒ convertStringToAction x ïŒ
objã調æ»ãã-> do
if ïŒ isVisible obj locObjects ïŒ
次㫠putStrLn ïŒ describeObject obj ïŒ
else putStrLn ïŒ "衚瀺ãããŸãã" ++ show obj ++ "hereã" ïŒ
curLocãå®è¡ããŸã
çµäº-> putStrLn ã äŒã ãŸããã...ã
...- æ®ãã®ã³ãŒã
以äžã§ãã ãã®éèŠãªæ³šæäºé
ã忢ããŸããäŒæ©ã®æéã§ãããã§ã«èšå€§ãªç¥èããããŸãã
ä¿®æ£ã®ããã®å²ãåœãŠã
1.ãªããžã§ã¯ãã«é¢é£ãããã¹ãŠã®æ©èœããªããžã§ã¯ãã¢ãžã¥ãŒã«ã«ãå Žæã«é¢é£ãããã¹ãŠã®æ©èœãå Žæã¢ãžã¥ãŒã«ã«è»¢éããŸãã
2.ãã±ãŒã·ã§ã³ãªããžã§ã¯ãã®å®éšççµè«ã次ã®åœ¢åŒã§äœæããŸãã
ããŒã
ããªãã¯æšè£œã®ããŒãã«ã®çãäžã®éšå±ã«ç«ã£ãŠããŸãã
ããã«ã¯ããã€ãã®ãªããžã§ã¯ãããããŸãã
åïŒçŽ æµãªèµ€ãæŽå士ã®åã
ããŒãã«ïŒåŒãåºãä»ãã®è¯ãæšè£œããŒãã«ã
é»è©±ïŒé»è©±ã«ã¯é³å£°ã¡ãã»ãŒãžããããŸãã
åŒãåºãïŒåŒãåºãã«ã¯ç¹å¥ãªãã®ã¯ãããŸããã
3. Investigateã¢ã¯ã·ã§ã³ã®åŠçããªãã¡ã¯ã¿ãªã³ã°ããã«ã¯ããã®ããã®åå¥ã®é¢æ°ãäœæããŸãã ãªãã¡ã¯ã¿ãªã³ã°åŸã®run颿°ã®ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
...
objã調æ»ãã-> do
putStrLn ïŒ obj locObjectsã調æ»ïŒ
curLocãå®è¡ããŸã
...
ãã®éšåã®ãœãŒã¹ ã
ç®æ¬¡ãåç
§ãããã³è¿œå æ
å ±
ã¯Greetingsã«ãããŸãã