å± é
ããªãã¯ãªãã³ã°ã«ãŒã ã«ããŸãã æ±ã«ã¯åºå ¥ãå£ã西ã«ã¯å¥åŠãªãŽã·ãã¯æ§åŒã®æåãæãããæšè£œã®ãã¢ãéããããŠããããã«èŠããããããã£ãŒã±ãŒã¹ãéšå±ã®äžå€®ã«å€§ããªæ±æŽã®æ·ç©ããããŸãã
ãããã£ãŒã±ãŒã¹ã®äžã«ã¯ãå€ãè¯ãæ代ã®ãšã«ãã®å£ãããã£ãŠããŸãã
ãããã£ãŒã±ãŒã¹ã«ã¯ãããããªãŒé§åã®çé®è£œã©ã³ã¿ã³ããããŸãã
å 容ïŒ
ãããã€
ããŒã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ã«ãããŸãã