å®è·µç·šïŒHaskellãããã¢ããªã±ãŒã·ã§ã³éçºããŸãåãå®çŸ©ãã¹ãã第äºèšèªãšããŠã®Haskellã
ãã©ã³ãã䜿ã£ãæåãªã²ãŒã ããã©ãã¯ãžã£ãã¯ãã®ææã®å€ãèšç®ãããã¢ããªã±ãŒã·ã§ã³ãæžããªãããHaskellã«ããããã°ã©ãã³ã°ã®äžå¿ãšãªããåãå®çŸ©ãããã®åãå©çšãã颿°ãæžããããšãå®è·µããŠã¿ãŸãããã
ããã«ã¡ã¯ãHaskell-jpã®å±±æ¬æ æ»ïŒigrepïŒã§ãã
Haskellã§ããã°ã©ãã³ã°ãå§ããã®ã«æäœéå¿
èŠãšãªããã®ããHaskellãããã£ãŠïŒãåããšã颿°ãã®åºæ¬ã解説ïŒããšããèšäºã§ã話ããŸããã
ãã®éã«ãHaskellã«ããããã°ã©ãã³ã°ã®å€§ããªéšåãå ããã®ã¯ãåé¡ã«åãããåãèªåã§èããŠå®çŸ©ãããã®åãå©çšãã颿°ãæžãããšã ãšå®£èšããŸããããå®è·µãããšãããŸã§ã¯èžã¿èŸŒã¿ãã§ããŸããã
ãã®èšäºã§ã¯ãå®éã«ã¢ããªã±ãŒã·ã§ã³ã®äžéšãæžããªããããåãå®çŸ©ãããã®åãå©çšãã颿°ãæžããããšãå®è·µããŠã¿ãŸãããã ãã®éäžã§ãHaskellã®ããŸããŸãªæ©èœãã颿°ã®çµã¿ç«ãŠæ¹ãåŠãã§ãããŸãã
顿ãšããŠã¯ããã©ã³ãã䜿ã£ãæåãªã²ãŒã ãããã©ãã¯ãžã£ãã¯ãã®ææã®å€ãèšç®ããã颿°ãäœããŸãã
- ãã©ãã¯ãžã£ãã¯ã«ãããææã®æ°ãæ¹
-
åãå®çŸ©ããŠãã«ãŒãïŒCardïŒãäœã
- ã«ãŒãã®çš®é¡ãåçŽã«åæããåãèãã
- 2ïœ10ã®ã«ãŒãã ãããã©ã¡ãŒã¿ã1ã€ãšãå¥ã®åã«ãããïŒçŽååïŒ
-
derivingã§ãåã¯ã©ã¹ã«å±ããåïŒã€ã³ã¹ã¿ã³ã¹ïŒãèªåã§å®çŸ©ãã
- 2ã€ã®å€ããçãããã©ããããæ¯èŒã§ãããããªåã«ããã«ã¯ïŒEqåã¯ã©ã¹ïŒ
- å€ãæååãšããŠè¡šç€ºã§ãããããªåã«ããã«ã¯ïŒShowåã¯ã©ã¹ïŒ
- ãã³ã©ã ãGHCiã®è¡šç€ºã¯show颿°ã®å€æçµæ
- Eqåã¯ã©ã¹ãšShowåã¯ã©ã¹ã®æ§è³ªãæè»œã«åŸã
- å®çŸ©ããCardåãçãããŠãéœåã®ããææã®åèšå€ãæ±ããã«ã¯
- Cardåã䜿ã£ã颿°ãäœã ãã®1 toPoint颿°
- toPoint颿°ãããã£ãŠããã¿ãŒã³ãããã®ç¹åŸŽãç¥ã
-
Cardåã䜿ã£ã颿°ãäœã ãã®2 sumHand颿°
- map: ãªã¹ãã®åèŠçŽ ã«å¯ŸããŠé¢æ°ãå®è¡ããçµæããŸããªã¹ãã«å ¥ãã
- letã§ããŒã«ã«å€æ°ã«é¢æ°ã®å®è¡çµæãä¿åãã
- foldl: ããããŸã§ã«åŠçããèŠçŽ ãã®æ å ±ã䜿ããªãããªã¹ãã倿ãã
- foldlãmapã䜿ã£ãŠãåãåŸããã¹ãŠã®åèšç¹æ°ãæ±ãã
- filter颿°ã§ãã¹ãããªãåèšç¹æ°ã®ã¿ãéžã¶
- å€ãè¿ãifãšå€ãè¿ããªã颿°
- ãŸãšããšæ¬¡åäºå
ãã©ãã¯ãžã£ãã¯ã«ãããææã®æ°ãæ¹
ãã©ãã¯ãžã£ãã¯ã¯ãæåã«é ããã2æã®ææãããšã«ã远å ã®ã«ãŒãã1æãã€èŠæ±ããŠãã£ãŠãææã®åèšã21ã«ãªãã¹ãè¿ã¥ããŠããã²ãŒã ã§ãã远å ã®ã«ãŒãã«ãã£ãŠææã®åèšã21ãè¶ããŠããŸã£ããè² ãã§ãã ææã®åèšãèšç®ãããšãã¯ã次ã®ãããªã«ãŒã«ã«åŸã£ãŠã«ãŒããæ°ããŸãã
ãã©ãã¯ãžã£ãã¯ã«ãããææã®æ°ãæ¹
ä»å玹ä»ãããœãŒã¹ã³ãŒãã¯ããã¹ãŠ{$_2}Yuji Yamamoto / haskell-as-second-language-blackjack · GitLabã«å ¬éããŠãããŸãã hspecã䜿ã£ããã¹ãã³ãŒãã®ã»ããstackã䜿ã£ãHaskellã§æžããããããžã§ã¯ãã®ãµã³ãã«ã«ããªã£ãŠããŸãã®ã§ãåèã«ããŠã¿ãŠãã ããã
åãå®çŸ©ããŠãã«ãŒãïŒCardïŒãäœã
æå§ãã«ããã©ãã¯ãžã£ãã¯ã®ã«ãŒãã衚ãåãå®çŸ©ããŸãããã ãã©ãã¯ãžã£ãã¯ã§äœ¿ããã©ã³ãã®ã«ãŒãã¯ãžã§ãŒã«ãŒãé€ãã52æã§ãããä»åã¯çµµæïŒããŒãããã€ã€ãã¯ã©ããã¹ããŒãïŒã®éãã¯ç¡èŠããAããKãŸã§ã®13çš®é¡ã®ã«ãŒãã衚çŸããåãèããŸãã
ã«ãŒãã®çš®é¡ãåçŽã«åæããåãèãã
Haskellã§ã¯ãdataãšããããŒã¯ãŒãã䜿ã£ãŠããŠãŒã¶ãŒå®çŸ©åãå®çŸ©ã§ããŸãã
dataã¯ãJavaã®ãããªãªããžã§ã¯ãæåèšèªã§ã¯ã©ã¹ãå®çŸ©ããã®ãšåããããªæ°åã§äœ¿ã£ãŠããã ããŠããŸããŸããã
詳现ã¯ãããã説æããŸããã倧äœåãããšããããã¯æ¯èŒå¯Ÿè±¡ã®èšèªã«ãã£ãŠã¯ãã以äžã®ããšãã§ããŸãã
13çš®é¡ã®ã«ãŒãã衚ãåãdataã§å®çŸ©ããã«ã¯ãããšãã°ãã®ããã«ããŸãã
data Card = A | N2 | N3 | N4 | N5 | N6 | N7 | N8 | N9 | N10 | J | Q | K deriving (Eq, Show)
data Card = ...ã§å§ãŸã£ãŠããããšããå¯ãããããšããããã®äŸã§ã¯Cardãšããååã®åã宣èšããŠããŸãã
åã®ååCardã®å
é Cã倧æåã«ãªã£ãŠããç¹ã«æ³šæããŠãã ããã
ååãšããŠãåã®ååã¯ã¢ã«ãã¡ããã倧æåã§å§ããªããã°ãªããªãããšã«ãªã£ãŠããŸãã
ãã®æ¬¡ã®è¡ã§ã¯ãCardåãã©ã®ãããªå€ãåãåŸãã®ãã衚ãããã«ãå€ã³ã³ã¹ãã©ã¯ã¿ãŒãåæããŠããŸãã
瞊æ£ïŒ|ïŒã¯ãããŸãã¯ããšèªã¿æ¿ããŠãã ããïŒoræŒç®åïŒ||ïŒãªã©ãšç±æ¥ã¯åãã§ãïŒã
äžèšã®äŸã¯ããåCardã¯ãAãŸãã¯N2ãŸãã¯N3ãŸãã¯N4ãŸãã¯ïŒ... é·ãã®ã§çç¥ ...ïŒãŸãã¯QãŸãã¯Kãšããå€ãåãåŸãããšããæå³ã«ãªããŸãã
äžèšã®å®çŸ©ã§ãã£ãŠããããšã¯ãJavaã®ãããªèšèªã§enumãå®çŸ©ããŠããã®ãšåããããªãã®ã ãšãããŸãã
ãAãŸãã¯N2ãŸãã¯N3ãŸãã¯N4ãŸãã¯ïŒ... é·ãã®ã§çç¥ ...ïŒãŸãã¯QãŸãã¯Kããšããå€ããšãenumãå®çŸ©ããŠããã®ãšåçãªã®ã§ãã
äžèšã®ã³ãŒããblackjack.hsãšãããã¡ã€ã«ã«ä¿åããŠããã®Cardåãæ£ããå®çŸ©ã§ããŠããããšã確èªããŠã¿ãŸãããã
stack ghciã³ãã³ãã§GHCiãèµ·åããåŸã:l blackjack.hsãšããŠãäœæãããã¡ã€ã«ãèªã¿èŸŒãã§ãã ããã
$ stack ghci > :l blackjack.hs
ãšã©ãŒãªããã¡ã€ã«ãèªã¿èŸŒããããå®çŸ©ããåã®å€ãå ¥åããŠäœãèµ·ããã確èªããŠã¿ãŸãããã
> A A > N2 N2
dataã§å®£èšããCardã®å€ã§ããAãN2ãå
¥åããŠããšã©ãŒã«ãªããªãããšãããGHCiãCardåã®å€ãèªèã§ããŠããããšãåãããŸãã
ãšã¯ãããä»ã®ãšããå
¥åããå€ã衚瀺ãããã ããªã®ã§ãæ¬åœã«å®çŸ©ã§ããŠããã®ã宿ãåããªããããããŸããã
ããããå Žåã¯ããã£ãã:qã§GHCiãçµäºãããåŸãåèµ·åããŠããäžåºŠAãN2ãªã©ãå
¥åããŠã¿ãŠãã ããã
GHCiãAãN2ãªã©ãèªèã§ããããšã©ãŒã«ãªãã¯ãã§ãã
åãå®çŸ©ã§ããããšãGHCiã®ã³ãã³ãã§ç¢ºèªãã
ååã®åŸ©ç¿ã«ãªããŸããã:tã:iãšãã£ãGHCiã®ã³ãã³ãã䜿ã£ãŠCardåãå®çŸ©ã§ãããã確èªããããšãã§ããŸãïŒãã¯ã埩ç¿ã«ãªããŸããã:lã:qãšåæ§ããããã¯GHCiå°çšã®ã³ãã³ãã§ããHaskellã®ææ³ãšã¯çŽæ¥é¢ä¿ããªãã®ã§ã泚æãã ããïŒã
:tã³ãã³ãïŒ:typeã®ç¥ïŒã¯ãåå説æãããšãããæå®ããå€ãã©ããªåã®å€ãæããŠãããã³ãã³ãã§ããAãKã«äœ¿ããšãã¡ãããšCardåã®å€ãšãªã£ãŠããããšãåãããŸããã
> :t A A :: Card > :t K K :: Card
:iã³ãã³ãïŒ:infoã®ç¥ïŒã¯ãå€ã«å¯ŸããŠäœ¿ãã ãã§ãªããåã«å¯ŸããŠã䜿ãã䟿å©ãªã³ãã³ãã§ããã
åã®ååãäžãããšãåã®å®çŸ©ã詳ããèŠãããšãã§ããŸãã
> :i Card data Card = A | N2 | N3 | N4 | N5 | N6 | N7 | N8 | N9 | N10 | J | Q | K -- Defined at blackjack.hs:95:1 instance [safe] Eq Card -- Defined at blackjack.hs:96:35 instance [safe] Show Card -- Defined at blackjack.hs:96:39
å
ã»ã©blackjack.hsã«ä¿åããCardåã®å®çŸ©ããã»ãŒãã®ãŸãŸåºãŠããŸãããæå³ããéãã«Cardåãã§ããŠããããã§ã
ïŒãinstance [safe] Show Cardããªã©ãšãã£ãéšåãæ°ã«ãªããããããŸããããç³ãèš³ãªããä»åã¯å²æãããŠããã ããŸãïŒã
ãã³ã©ã ãã«ãŒãã®åãçã®æŽæ°ã§è¡šãã®ã§ã¯ã ããªã®ïŒ
ãã©ã³ãã®å€§åã®ã«ãŒãã¯æ°åã®ã«ãŒããªã®ã§ããããCardåãèªåã§å®çŸ©ããããããåçŽã«æŽæ°ïŒIntåãªã©ïŒã§è¡šãã®ã§ã¯ã ããªã®ã§ããããã
ãã®ã»ãããããšã§åèšãèšç®ãããšãã«ã楜ããã§ãã
ããããIntã§ã«ãŒãã衚ãããšã«ã¯ã次ã®ãããªåé¡ããããŸãã
- ãã©ãã¯ãžã£ãã¯ã®ã«ãŒã«äžã
Aã¯1ç¹ãšã11ç¹ãšãæ°ããããšãã§ãããåãªãIntã§ã¯ããã衚çŸã§ããªã - ã«ãŒãã
Intã§è¡šçŸããŠããŸããšãIntã§è¡šããããªã»ãã®å€ãšçŽãããããªã- ãã倿°ã«æŽæ°
1ãä»£å ¥ãããŠãããšãããããææãèšç®ããåèšã®ã1ããªã®ãããããšãææãèšç®ããåã®ã«ãŒãAã衚ãã1ããªã®ããåºå¥ã§ããªã - ã»ãã®æå³ã§ãæŽæ°ã®
1ã䜿ãããšããããããããšãã°ããªã³ã©ã€ã³å¯ŸæŠãã³ã€ã³ããããæ©èœãããã°ãã1ãã§ãŠãŒã¶ãŒã®IDã衚ãããããŠãŒã¶ãŒããããããã³ã€ã³ã®ææ°ã衚ããããããããããªã
- ãã倿°ã«æŽæ°
ã«ãŒãã«ã¯ã«ãŒãã®ããã®åãå²ãåœãŠãã»ãããããããçŽããããã軜æžããééããå°ãªãã§ããã®ã§ãã
2ïœ10ã®ã«ãŒãã ãããã©ã¡ãŒã¿ã1ã€ãšãå¥ã®åã«ãããïŒçŽååïŒ
:iã³ãã³ãã§Cardåã®æ
å ±ã衚瀺ããããšãåã®å®çŸ©ã次ã®ããã«è¡šç€ºãããŸããã
> :i Card data Card = A | N2 | N3 | N4 | N5 | N6 | N7 | N8 | N9 | N10 | J | Q | K
ãã®çµæãèŠããšããã®å®çŸ©ã®ãN2 | N3 | N4 | N5 | N6 | N7 | N8 | N9 | N10ããšããéšåãã¡ãã£ãšåé·ã«æããŸããã
ä»åã®ã«ãŒãã®ä»æ§ã§ã¯ã2ãã10ãŸã§ã®ã«ãŒãã¯åãå€ã®æŽæ°ãš1察1ã«å¯Ÿå¿ããŠããŸãã
ãããããŸãšããŠIntã«é¢é£ä»ããŠè¡šããã°ãCardåã®å®çŸ©ã¯ããªããã£ãããããã§ãã
ãã ããèŠããäžã®åºå¥ãããJãQãKãšãç¹æ°èšç®ã®ã«ãŒã«ãã»ãã®ã«ãŒããšç°ãªãAã¯ãIntã«é¢é£ä»ããŠè¡šãããã«ã¯ãããŸããã
AãJãQãK以å€ã®å€ã ããIntã«é¢é£ä»ããŠè¡šãããšãã§ãããããçŽæçã§å®æ
ã«åãã«ãŒãã®åãäœããªããã®ã§ããããã
ããããã®ãŸããŸå®çŸããã®ããHaskellã®çŽååãšåŒã°ããæ©èœã§ãã
çŽååã䜿ã£ãCardåã®å®çŸ©ã¯ãããªããŸãã
data Card = A | N Int | J | Q | K deriving (Eq, Show)
CardåãåãåŸãå€ã³ã³ã¹ãã©ã¯ã¿ãŒã瞊æ£|ãçšããŠåæããŠããç¹ã¯ãå
ã»ã©ã®å®çŸ©ãšåãã§ãã
AãJãQãKã®4ã€ã®å€ã³ã³ã¹ãã©ã¯ã¿ãŒã«ã€ããŠããäœãå€ããŠããŸããã
ããããN2 | N3 | N4 | N5 | N6 | N7 | N8 | N9 | N10ãšé·ã£ããããã£ãéšåããN IntãšãŸãšããããŠããŸããã
ãã®N Intãäžäœäœã衚ããŠããã®ã§ãããããã»ãã®å€ã³ã³ã¹ãã©ã¯ã¿ãŒãšã¯ç°ãªããNã®åŸãã«Intãä»ãã圢ãããŠããŸãããå®ã¯ãã®N Intãå€ã³ã³ã¹ãã©ã¯ã¿ãŒã§ãã
ãŸããN Intã®å
é ã«ããNã¯ããã®å€ã³ã³ã¹ãã©ã¯ã¿ãŒã®ååã§ããåã®å€ã³ã³ã¹ãã©ã¯ã¿ãŒã«ååãããã®ã¯ããããŸã§ã«åºãŠããå€ã³ã³ã¹ãã©ã¯ã¿âã®AãJãN1ãªã©ãšåãã§ãã
ãããŠãNã®åŸãã«ä»ããŠããIntã¯ããå€ã³ã³ã¹ãã©ã¯ã¿ãŒNã®åŒæ°ã®åãã§ãã
ãããããªããžã§ã¯ãæåèšèªã«ãããŠããã£ãŒã«ãããšããããããã£ããšåŒã°ããŠãããã®ããšãããšãã³ãšãã人ããããããããŸãããã
ããã§éèŠãªã®ã¯ããã®Intåã®åŒæ°ãä¿æã§ããã®ã¯å€ã³ã³ã¹ãã©ã¯ã¿ãŒãNã®ãšãã ããšããç¹ã§ãã
å€ã³ã³ã¹ãã©ã¯ã¿ãŒã䜿ã£ãçŽååã®å®çŸ©
å€ã³ã³ã¹ãã©ã¯ã¿ãŒã®åŒæ°ã«ã€ããŠãããå°ãã ãå¥ã®äŸã§ã説æããŠã¿ãŸãããã
ããŒã¿åã®å®çŸ©æ¹æ³ã®èª¬æã§ã¯ãååStringãšå¹Žéœ¢Intã®äººç©ã衚çŸãããæ¬¡ã®ãããªPersonåã®å®çŸ©ããã䜿ãããŸãã
data Person = Person String Int
ååãªã®ã§çŽããããã§ãããåã®ååãPersonã§ããã®å¯äžã®å€ã³ã³ã¹ãã©ã¯ã¿âãPerson String Intã§ãã
ãã®å€ã³ã³ã¹ãã©ã¯ã¿ãŒã®ååãPersonã§ãã¹ããŒã¹ã§åºåãããæ®ãã®String Intã¯ãå€ã³ã³ã¹ãã©ã¯ã¿ãŒPersonã®åŒæ°ã®åãèšãæãããšãããããã£ã®åã衚ããŠããŸãã
ããããã£ã«ååãä»ããŠããããåã ãæå®ããŠå®çŸ©ãããŠããããšã«é©ãã人ãå€ãã§ããããHaskellã§ã¯ããã®ããã«ãå€ã³ã³ã¹ãã©ã¯ã¿ãŒã«ååãæããªãåŒæ°ãå®çŸ©ã§ããã®ã§ãïŒååãã€ããæ¹æ³ããããŸãããä»åã¯å²æããŸãïŒã
ããããååãæããªãããããã£ã«äžäœã©ããã£ãŠã¢ã¯ã»ã¹ããã°ããã®ã§ãããïŒã
ã»ãã®èšèªã§ããã°ãããããã£ã®ã¢ã¯ã»ã¹ã«ã¯person.nameãcard.numberãªã©ãšãããšããã§ãããååããªãã®ã§ãããã§ããŸããã
å®ã¯ãHaskellã§ã¯ããã¿ãŒã³ãããããšããæ©èœã䜿ã£ãŠå€ã³ã³ã¹ãã©ã¯ã¿âã®åŒæ°ãå©çšããŸãã詳现ã¯åŸã»ã©èª¬æããŸãã®ã§ããæ¥œãã¿ã«ã
Cardåã®è©±ã«æ»ããŸããæ°ããCardåã®å®çŸ©ã§ã¯ãAãNãJãQãKã®5ã€ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã®ãã¡ãNã ããã«ãŒãã®çªå·ã衚ãIntåã®ããããã£ãæã€ããã«ããŸããã
ããã§Cardåããã¡ããšå®çŸ©ã§ããŠãããã©ãããæ°ããCardåã®å®çŸ©ã§blackjack.hsãæžãæããŠããGHCiäžã§è©ŠããŠã¿ãŸãããã
> :l blackjack.hs > :i Card data Card = A | N Int | J | Q | K instance [safe] Eq Card instance [safe] Show Card > A A > :t A A :: Card
:iã³ãã³ãã®çµæè¡šç€ºã¯ãdata Cardã®éšåãå€ãã£ã以å€ãä»ã®ãšããå€åã¯ãããŸãããå®çŸ©ãå€ããŠããªãå€ã³ã³ã¹ãã©ã¯ã¿ãŒAãKããã®ãŸãŸäœ¿ããŸãã
ã§ã¯ãNã¯ã©ãã§ãããïŒ
> N <interactive>:5:1: error: ã» No instance for (Show (Int -> Card)) arising from a use of âprintâ (maybe you haven't applied a function to enough arguments?) ã» In a stmt of an interactive GHCi command: print it
ãã®ãŸãŸGHCiã«å
¥åãããšãšã©ãŒã«ãªã£ãŠããŸããŸããã:tã§åãèŠããšã©ããªãã§ããããïŒ
> :t N N :: Int -> Card
Int -> Cardãšããåãè¿ã£ãŠããŸãããããã¯ãååã玹ä»ãã颿°åã§ãã
ãã®å ŽåããIntåã®å€ãåãåã£ãŠCardåã®å€ãè¿ã颿°ããšããæå³ã«ãªããŸãã
ãããNã¯Intåã®å€ïŒæŽæ°ïŒãåãåã颿°ãšãªã£ãã®ã§ãïŒ
æ®å¿µãªããGHCiã§ã¯é¢æ°ã衚瀺ãããããšãã§ããŸããïŒããã¯ãã©ã¡ãããšãããšHaskellã®éœåã§ãã詳ããã¯ãè±èªã§ããHaskellWikiã®ãShow instance for functionsããã芧ãã ããïŒã
å
ã»ã©ã®ãšã©ãŒã¯ãã颿°ãå
¥åããŠããã³ã³ãœãŒã«ã«ã¯è¡šç€ºã§ããªããããšãããšã©ãŒã ã£ãã®ã§ãã
ä»åºŠã¯ãNã«åŒæ°ãæå®ãã颿°ãšããŠäœ¿ã£ãŠã¿ãŸãããã
颿°ãåŒã³åºãã«ã¯ãååã®èšäºã§bmi颿°ã䜿ã£ããšãã®ããã«ã颿°åãšåŒæ°ãã¹ããŒã¹ã§åºåã£ãŠäžŠã¹ãã ãã§ãããã
> N 2 N 2
ä»åºŠã¯ãšã©ãŒã«ãªããŸããã ã§ã¯ãåã¯ã©ããªã£ãŠããã§ãããïŒ
> :t N 2 N 2 :: Card
ãN 2ã¯Cardåã§ããããšããçµæãè¿ã£ãŠããŸããã
ãã®ããã«ãCardåã®å€ã³ã³ã¹ãã©ã¯ã¿ãŒNã¯ã颿°ãšããŠIntãåãåã£ãŠã¯ãããŠCardåã®å€ãšãªãã®ã§ãã
ããã¯ãJavaãªã©ã®ãªããžã§ã¯ãæåèšèªã§ã³ã³ã¹ãã©ã¯ã¿ãŒã«åŒæ°ãäžããŠããã®ãšåããããªãã®ã§ãã
å€ã³ã³ã¹ãã©ã¯ã¿âã§ããäžããåŒæ°ããã®ãŸãŸNã®ããããã£ãŒãšãªããŸãã
ãããŠãAãJãQãKãIntãåãåããã«Cardåãšãªã£ãŠããããšããåãããšãããã«ãŒãçªå·ãšããŠIntãåãåãã®ã¯Nã ããªã®ã§ãã
以äžã«ãããæ°åã®ã«ãŒãã ãã«æŽæ°ãé¢é£ä»ããŠåãå®çŸ©ãããšããèŠä»¶ãæºããããšãã§ããŸããã
derivingã§ãåã¯ã©ã¹ã«å±ããåïŒã€ã³ã¹ã¿ã³ã¹ïŒãèªåã§å®çŸ©ãã
ãããŸã§ãCardåãäŸãšããŠãHaskellã«ãããŠæ°ããåãäœæããæ¹æ³ã玹ä»ããŸããã
ããããªãããæ°ããåãå®çŸ©ããæ§æã«ã€ããŠããŸã 玹ä»ãåããŠããªãç®æããããŸãã
å
ã»ã©ã®Cardåã®å®£èšã®æ«å°Ÿã«ããderiving (Eq, Show)ãšããç®æã§ãã
data Card = A | N Int | J | Q | K deriving (Eq, Show)
deriving (Eq, Show)ãšããã®ã¯ãCardåãEqåã¯ã©ã¹ãšShowåã¯ã©ã¹ã«æå±ãããïŒCardåãEqåã¯ã©ã¹ãšShowåã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã«ããïŒããã«å¿
èŠãªå®£èšã§ãã
åã¯ã©ã¹ã¯ãååã®èšäºã§èª¬æãããšããããåããããªç¹åŸŽïŒæ¯ãèãïŒãæã£ãåããã²ã£ããããŠæ±ããããã«ããä»çµã¿ãã§ãã
Numåã¯ã©ã¹ããè¶³ãç®ãããç®ãåŒãç®ãã§ããåãããŸãšããåã¯ã©ã¹ã§ãã£ãããFractionalåã¯ã©ã¹ãããããã«å ããŠå²ãç®ãã§ããåãããŸãšããåã¯ã©ã¹ã§ãã£ããããããã«ãããããã®åã¯ã©ã¹ã«ã¯ãããããããŸãšããåã«å
±éããç¹åŸŽããããŸãã
ã§ã¯ãEqåã¯ã©ã¹ãšShowåã¯ã©ã¹ã«ã¯ã©ããªç¹åŸŽãããã®ã§ãããïŒã
Eqåã¯ã©ã¹ãšShowåã¯ã©ã¹ã®ç¹åŸŽã¯éåžžã«ãã䜿ãããã®ã§ãèªåã§å®çŸ©ããåã«ã¯ã»ãšãã©ãã€ãderiving (Eq, Show)ãä»ããŠå®£èšããããªãã¯ãã§ãïŒ
2ã€ã®å€ããçãããã©ããããæ¯èŒã§ãããããªåã«ããã«ã¯ïŒEqåã¯ã©ã¹ïŒ
Eqåã¯ã©ã¹ã¯ã2ã€ã®å€ããçãããã©ãããæ¯èŒã§ããåããŸãšããåã¯ã©ã¹ã§ãã
å
·äœçã«ã¯ãããªãã¿ã®==ã§2ã€ã®å€ãæ¯èŒã§ãããããªåãšããããšã§ãã
IntãCharãStringããªã¹ããªã©ããããŸã§ã®èª¬æã«åºãŠããåã¯ã颿°åãšIOåãé€ããŠãã¹ãŠEqåã¯ã©ã¹ã«æå±ããŠããŸãã
GHCiã§ç¢ºãããŠã¿ãŸãããã
> 'a' == 'a' True > True == True True > 3 == 2 False > "hello" == "Hello" False -- ãªã¹ããã¿ãã«ãæ¯èŒããéã®ã==ãã¯ããã¹ãŠã®èŠçŽ ãã==ãã§æ¯èŒããŠã -- ãã¹ãŠãçããå Žåã®ã¿Trueãè¿ã > ('a', True) == ('c', True) False > [1, 2, 3] == [1, 2, 3] True
ã¡ãªã¿ã«ãHaskellã®==ã«ã¯ã»ãã®ããã°ã©ãã³ã°èšèªã«ã¯ãªãã¡ãã£ãšå€ãã£ãç¹åŸŽããã£ãŠãåãåå士ã®å€ã§ãªããšæ¯èŒãã§ããŸããã
ããšãã°ã次ã®ããã«çåœå€Trueãš"True"ãšããæååãæ¯èŒããããšãããšåãšã©ãŒã«ãªããŸãã
> True == "True" <interactive>:9:9: error: ⢠Couldn't match expected type âBoolâ with actual type â[Char]â ⢠In the second argument of â(==)â, namely â"True"â In the expression: True == "True" In an equation for âitâ: it = True == "True"
ã¡ãã£ãšå³ããæããããç¥ããŸããããã»ãã®ããã°ã©ãã³ã°èšèªã§ããæé»ã®å倿ãåããããªã±ãŒã¹ãé€ãã°ãéãåã®å€ã«ããæ¯èŒã¯Falseãè¿ãããšã«ãªãã§ãããããéåžžã¯ããå¿
èŠããªãã§ãããã
åãææ§ã«ãªãããšãå«ãHaskellã§ã¯ãæé»ã®å倿ãéãåã®å€ã®æ¯èŒãèªããŠããªããšããã ãã®ããšã§ãã
å€ãæååãšããŠè¡šç€ºã§ãããããªåã«ããã«ã¯ïŒShowåã¯ã©ã¹ïŒ
Showåã¯ã©ã¹ã«å±ããåã¯ãshowãšãã颿°ã«ãã£ãŠãå€ãæååã«å€æã§ããŸãã
Showåã¯ã©ã¹ã«ã€ããŠããIntãCharãStringããªã¹ããªã©ãåå玹ä»ããåã¯ã颿°åãšIOåãé€ããŠãã¹ãŠæå±ããŠããŸãã
ãã¡ããGHCiã§ç¢ºãããŠã¿ãŸãããã
> show 'a' "'a'" > show False "False" > show "12345" "\"12345\"" > show 12345 "12345" > show 139.17 "139.17" > show ('c', True) "('c',True)" > show [3, 2, 1] "[3,2,1]"
æåå"12345"ãshowããå Žåã«ã¯ã"12345"ãšããæååãã®ãã®ã§ã¯ãªããããã«ã¯ã©ãŒãã§å²ã£ã"\"12345\""ïŒããã«ã¯ã©ãŒããããã¯ã¹ã©ãã·ã¥ã§ãšã¹ã±ãŒããããŠããããšã«æ³šæïŒãåºåãããŸããã
ãã®ããšããåããããã«ãshow颿°ã«ãã£ãŠäœæãããæååã¯ãã»ãã®åã®å€ãshowããæååããåºå¥ã§ããããã«äœãããŠããŸãã
ããšãã°ãäžèšã®show "12345"ã®çµæãšshow 12345ã®çµæãæ¯èŒããŠã¿ããšãåãéããšéãæååãè¿ã£ãŠããããã«äœãããŠããããšãåãããŸãã
ããããæå³ã§ã¯ãRubyã§ããã°to_sã¡ãœãããããinspectã¡ãœãããPythonã§ããã°str颿°ãããrepr颿°ã«è¿ãæåã§ãã
ãããã£ãŠãshow颿°ã¯ãã©ã¡ãããšãããšãããã°ã§å€ã®äžèº«ãèŠãããã«äœ¿çšããã®ãããããã§ãã
ãã³ã©ã ãGHCiã®è¡šç€ºã¯show颿°ã®å€æçµæ
å®ã¯ãGHCiã§å
¥åããåŒãã³ã³ãœãŒã«äžã«è¡šç€ºããéã«ããå
éšã§ã¯show颿°ã䜿çšããŠããŸãã
å
¥åããåŒã®å€ããshow颿°ã§æååã«å€æããããšã§è¡šç€ºããŠããã®ã§ãã
ãªã®ã§ãäžèšã®ããã«ãShowåã¯ã©ã¹ã«å±ããªã颿°åã®å€ãå
¥åãããšãšã©ãŒã«ãªã£ãŠããŸããŸãã
> (+)
<interactive>:15:1: error:
⢠No instance for (Show (a0 -> a0 -> a0))
arising from a use of âprintâ
(maybe you haven't applied a function to enough arguments?)
⢠In a stmt of an interactive GHCi command: print it
> not
<interactive>:16:1: error:
⢠No instance for (Show (Bool -> Bool))
arising from a use of âprintâ
(maybe you haven't applied a function to enough arguments?)
⢠In a stmt of an interactive GHCi command: print itããããç¹åŸŽã®ãããèªåã§å®çŸ©ããåãShowåã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã«ããŠãããšãå®çŸ©ããåã®å€ãè¿ã颿°ãGHCiã§è©Šãããšããã©ããªå€ãè¿ã£ããã確èªããã®ãç°¡åã«ãªããŸãïŒ
ãããŠã以äžã§èª¬æããããã«ãderiving Showãšããã ãã§ãããã¿ãã§æã«å
¥ãã®ã§ãã
Eqåã¯ã©ã¹ãšShowåã¯ã©ã¹ã®æ§è³ªãæè»œã«åŸã
ãã®é
ã®åé ã§èª¬æããããã«ãderiving (Eq, Show)ãšæžãããšã«ãã£ãŠãCardåãEqåã¯ã©ã¹ãšShowåã¯ã©ã¹ã«èªåã§æå±ãããïŒCardåãEqåã¯ã©ã¹ãšShowåã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã«ããïŒããšãã§ããã®ã§ããã
ããããèªåã§è¡ããšããããšã¯ãCardåã®å€ã==ã§æ¯èŒããæ¹æ³ããshow颿°ã§Cardåã®å€ãæååã«å€æããæ¹æ³ããèªåã§å®çŸ©ãããšããæå³ã§ãã
å
·äœçã«ã©ã®ããã«==ã§æ¯èŒããããshow颿°ã§æååã«å€æãããããã®ã§ããããïŒ
å®ã¯ãCardåãshow颿°ã§ã©ã®ãããªæååã«å€æããããã¯ããã§ã«ç¥ã£ãŠããŸãã
GHCiäžã§æ¬¡ã®ããã«å
¥åãããšãã®ããšãæãåºããŠãã ããã
> A A > N 2 N 2
å€ã³ã³ã¹ãã©ã¯ã¿ãŒAãå
¥åãããšãããåŒæ°ãäžããå€ã³ã³ã¹ãã©ã¯ã¿ãŒN 2ãå
¥åãããšãããããããå
¥åããæååããã®ãŸãŸåºåãããŸããã
ãããŠãshow颿°ã¯ãGHCiã§å
¥åããåŒãã³ã³ãœãŒã«äžã«è¡šç€ºããéã«å
éšã§äœ¿çšãããŠããŸãã
ãšããããšã¯ãäžèšã®å®è¡äŸã§è¡šç€ºãããçµæã¯ãCardåã®å€ãshow颿°ã§å€æããéã®æååã ãšããããšã§ããã
詊ãã«show颿°ãå®è¡ããŠã¿ããšããã®ããšãããã¯ã£ããåãããŸãã
> show A "A" > show (N 7) -- äžžã«ãã³ã§å²ãã®ãå¿ããªãã§ãã ããïŒ "N 7" > show J "J" > show Q "Q" > show K "K"
ãã®ããã«ãderiving ShowããŠå®çŸ©ãããåã®show颿°ã¯ãå€ã³ã³ã¹ãã©ã¯ã¿ãŒããå€ã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ããåŒæ°ïŒå€ã³ã³ã¹ãã©ã¯ã¿ãŒã®ããããã£ïŒããã®ãŸãŸæååãšããŠè¿ãããã«å®çŸ©ãããŸãã
ããã¯ãå
ã»ã©ãè§Šããããããã°ã®éãå€ã®äžèº«ãèŠãããã«äœ¿çšããããšããçšéã«ããããããŠãããšèšããã§ãããã
åºåãããæååããã®ãŸãŸãœãŒã¹ã³ãŒãã«è²Œãä»ããŠåå©çšãããšãã£ãçšéã«ãåããŠããŸãã
Cardåã®Eqåã¯ã©ã¹ã®å®è£
ã«ã€ããŠããGHCiã§è©ŠããŠã¿ããšããåããã§ãããã
-- åãçš®é¡ã®å€ã³ã³ã¹ãã©ã¯ã¿ãŒã ããTrue > A == A True -- ãã以å€ã¯ãã¹ãŠFalse > A == J False > A == K False > J == J True > A == N 3 False -- åŒæ°ïŒããããã£ïŒãæã€å€ã³ã³ã¹ãã©ã¯ã¿ãŒãã -- ãã¡ããéãçš®é¡ã®å€ã³ã³ã¹ãã©ã¯ã¿ãŒã ãšFalse > N 3 == K False -- åãçš®é¡ã®å€ã³ã³ã¹ãã©ã¯ã¿ãŒã§ãã -- æž¡ããåŒæ°ãåãå€ïŒã==ãã§æ¯èŒãããïŒ -- ã§ãªããã°False > N 3 == N 2 False -- å€ã³ã³ã¹ãã©ã¯ã¿ãŒã®çš®é¡ãš -- æž¡ããåŒæ°ãåãå€ã«ãªã£ãŠåããŠTrue > N 3 == N 3 True
ãã®ããã«ãderiving (Eq, Show)ããŠäœããã==颿°ã®å®è£
ã¯ãäž¡æ¹ãšãéåžžã«çŽæçãªãã®ãšãªã£ãŠããŸãã
Eqåã¯ã©ã¹ãšShowåã¯ã©ã¹ã®ãŠãŒã¹ã±ãŒã¹ã¯æ³å以äžã«å€ããããŸãã
ããšãã°ãhspecãªã©ã®èªåãã¹ããã¬ãŒã ã¯ãŒã¯ã«ãããŠæåŸ
ããçµæãšå®éã®çµæãçãããã©ããã確èªããããçãããªãã£ãå Žåã«å®éã®çµæã衚瀺ãããããã«ã¯ã察象ã®åãShowåã¯ã©ã¹ãEqåã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã§ããå¿
èŠããããŸãã
ãã®ãããã¿ãªãããæ°ãã«å®çŸ©ããåã«ã¯ãç¹å¥ãªäºæ
ãããå Žåãé€ããŠããªãã¹ãderiving (Eq, Show)ãšããŸããªãã®ããã«æžããŠããããšãããããããŸãã
ã¡ãªã¿ã«ããç¹å¥ãªäºæ
ãããå Žåããšã¯ãããšããšEqåã¯ã©ã¹ã«ãShowåã¯ã©ã¹ã«ãå±ããŠããªãIOåã颿°åã®å€ãããããã£ãšããŠæã€åãå®çŸ©ããå Žåãªã©ã該åœããŸãã
å®çŸ©ããCardåãçãããŠãéœåã®ããææã®åèšå€ãæ±ããã«ã¯
Cardåãå®çŸ©ã§ãããšããã§ããã®åã®ç¹åŸŽãå©çšããææã®åèšãæ±ãã颿°ãæžããŠãããŸãããã
ãŸãããã®ãããªé¢æ°ã®åãèããŸãã
ææã¯è€æ°ã®Cardã§ããããææã®åã¯Cardã®ãªã¹ã[Card]ã§ããã§ãããã
ææãèšç®ããåèšã®ã»ãã¯ãæŽæ°ã«ãªãã®ã§ãIntã§è¡šçŸããŸãããã
ãã®é¢æ°ã®ååã¯ãææïŒhandïŒãåèšããã®ã§ããã®ãŸãŸsumHandãšããŸãããã
以äžããŸãšãããšãææã®åèšãæ±ãã颿°sumHandã¯ãCardã®ãªã¹ããåãåã£ãŠIntãè¿ããã®ã«ãªãããã§ããã
ãã®ããšãåã§è¡šããšããããªããŸãã
sumHand :: [Card] -> Int
ãã®ããã«ã颿°ã®ååã®åŸãã®ã³ãã³2ã€::以éã§é¢æ°ã®å
·äœçãªååã瀺ãããã®ãã颿°ã®å宣èšãšãããŸãã
Haskellã§é¢æ°ãå®çŸ©ãããšãã¯ãå宣èšã1è¡ãã«æèšããããšã§ãããã®é¢æ°ãããã°ã©ã ã®ã©ãã«åœ±é¿ãäžããã®ããã®ç¯å²ã瀺ããŸãã
颿°ã®å®çŸ©ã«å宣èšãä»ããŠãããããã§ã
- å ¥åºååŠçãè¡ã颿°ãïŒã€ãŸããããã°ã©ã ã®å€ã®äžçã«åœ±é¿ããããïŒïŒ
- æé»ã«å ±æãããŠãã倿°ãèªã¿æžããã颿°ãªã®ãïŒããã°ã©ã å ã§åºç¯å²ã«å ±æãããŠãã倿°ã«åœ±é¿ããããïŒïŒ
- ãšã©ãŒãçºçãããŠåŸç¶ã®åŠçã匷å¶çµäºããã颿°ãªã®ãïŒããã°ã©ã ã®ãããŒã«åœ±é¿ãããïŒïŒ
- ã¯ããŸããåçŽã«å€ãè¿ãã ãã®é¢æ°ãïŒæ»ãå€ãåãåã倿°ã«åœ±é¿ãããïŒïŒ
ãšãã£ãããšãã颿°ã®åã ãã§æç€ºã§ããã®ã§ãïŒå®éã«ã¯ããããã°ãªã©ã®ããã«äœãããäŸå€ããããŸãïŒã
ãã³ã©ã ãå宣èšã¯åžžã«å¿ èŠãïŒ
éçåä»ãèšèªã«æµæãããæ¹ã¯ãããããå宣èšãæžãããšãé¢åããããªãšæãããããããããŸããã
å®éãHaskellã«ã¯åŒ·åãªåæšè«ã®æ©èœãåãã£ãŠããã®ã§ãå€ãã®å Žåã¯åãããããæžãå¿
èŠã¯ãããŸããïŒååã®èšäºã®bmi颿°ã§ããå宣èšã¯ãããŠçç¥ããŠããŸããïŒã
ããã§ããå宣èšãããããšã§é¢æ°ã®åãæç€ºããã°ãã³ã³ãã€ã©ãŒãèªåã§æ£ããã蚌æããŠãããä¿¡é Œæ§ã®é«ãããã¥ã¡ã³ãã«ãªããŸãã ã¿ãªããããåãããããã®ããã«ã颿°ã®å®çŸ©ã§ã¯ç©æ¥µçã«åãæç€ºããããšãããããããŸãã
ç¶ããŠå ·äœçãªé¢æ°ã®äžèº«ãèããŸãããã å宣èšã®äžã«ã颿°ã®å®çŸ©ãæžããŠãããŸãã 颿°ãå®çŸ©ãããšãã¯ã颿°åãšåŒæ°åãæžããŠãã€ã³ãŒã«èšå·ã®åŸãã«å ·äœçãªåŠçãæžããŠããã®ã§ãããã
sumHand :: [Card] -> Int sumHand cards = ...
ã...ãã®éšåã¯ãæé ãšããŠèãããšã以äžã®ãããªã¢ã«ãŽãªãºã ã«ãªãã§ããããïŒ
- ææã®åã«ãŒãããåãåŸãå€ã«å€æãã
- åãåŸãå€ã®çµã¿åãããã¹ãŠã«ã€ããŠãããããåèšãæ±ãã
- åèšã®ãã¡ããã¹ãããªãïŒåèšã21ãè¶ ããªãïŒãã®ã®ã¿ãéžã¶
- ãã¹ãããªãåèšã1ã€ã§ããã£ãå Žåããã®äžããæãé«ãå€ã®åèšãéžãã§è¿ã
- ãã¹ãããªãåèšã1ã€ããªãå ŽåïŒã©ã®åèšããã¹ãããŠããŸãïŒãåèšã®äžããé©åœãªãã®ãéžãã§è¿ãïŒããã§ã¯ããªã¹ãã®å é ããéžã¶ãã®ãšããŸãïŒ
ãã©ãã¯ãžã£ãã¯ã«ã¯ããAã¯1ãŸãã¯11ã®ã©ã¡ãã§ãéœåã®ããã»ãã§èšç®ã§ããããšããã«ãŒã«ãããã®ã§ãããã«å¯Ÿå¿ããããããŸãã¯ææã®åã«ãŒããå¯èœæ§ã®ããå€ã®ãªã¹ãã«å€æããŠããŸãã
ããšã¯ããã®å€ã®çµã¿åããã®ãã¡ã§éœåãããå€ïŒã€ãŸãã21ã«ãã£ãšãè¿ã21ãè¶ããªãå€ïŒãéžã³åºãããã®æé ã§ãã
sumHandã®ã¢ã«ãŽãªãºã
ãã®é¢æ°ã®ç®çã¯ããããŸã§ããææã®åèšãèšç®ãããããšãªã®ã§ãäžèšã®æé ã ãã§èŠä»¶ã¯ãã¹ãŠæºããããã§ãã å ¥åºååŠçãªã©ã¯äžåå¿ èŠãããŸãããã ããã§ããå€ãåãåã£ãŠè¿ã以å€ã«ã¯äœãããªããçŽç²ãªé¢æ°ã®ã¿ãçµã¿åãããããšã§ãç®çã®é¢æ°ãäœã£ãŠããããšã«ããŸãã
以éã®è§£èª¬ã§ã¯ããããªãsumHandãå®çŸ©ããŠããã®ã§ã¯ãªãããŸãäžèšã®ã¢ã«ãŽãªãºã ã®1ã€ç®ã®æé ãææã®åã«ãŒãããåãåŸãå€ã«å€æããããæ
ã颿°ãå®çŸ©ããŸãã
ãã®ãããæžãããã®sumHandã®å®çŸ©ã¯ãæåéãundefinedïŒæªå®çŸ©ïŒãšããŠãããŠãã ããã
sumHand :: [Card] -> Int sumHand cards = undefined
undefinedã¯ã颿°ã倿°ã®äžèº«ãæªå®çŸ©ãªå Žåã«äœ¿çšãããç¹å¥ãªå€ã§ãã
ã¡ããã©Javaã«ãããnullã®ããã«ãã©ã®ãããªåã®å€ã®ä»£ããã«ããªããã®ã§ã匷åŒã«åãšã©ãŒãåé¿ããããšãã§ããŸãã
ãã ããundefinedãªãŸãŸã§sumHandã䜿çšãããšå®è¡æã«å¿
ããšã©ãŒã«ãªã£ãŠããŸãã®ã§ãããããããæ³šæãã ããã
undefinedã¯ããããŸã§ããåŸã§æžãããšããæå³ãäŒããããã ãã«äœ¿çšããŠãã ããã
Cardåã䜿ã£ã颿°ãäœã ãã®1 toPoint颿°
ãCardåã倿ããŠåãåŸãå€ã«ãã颿°ãã®ååã¯ãtoPointãšããŸãããã
ãããªãçãããèŠããŠããŸããŸãããäžèšãtoPointã®Haskellã§ã®å®çŸ©ã§ãã
toPoint :: Card -> [Int] -- 颿°ã®åã®å®£èš toPoint A = [1, 11] -- Aã®å Žåã¯1ãš11ãåãåŸã toPoint (N n) = [n] -- éåžžã®æ°åã®ã«ãŒãã§ããã°ãã«ãŒãã«æžãããæ°åã®ã¿ãåãåŸã toPoint _ = [10] -- ãã®ã»ãã®å Žåã¯10ã®ã¿ããšã
ååå®çŸ©ããbmi颿°ã§ã¯äœ¿çšããªãã£ãæ§æãããã€ã䜿çšããŠããã®ã§ãããããäžå¯§ã«è§£èª¬ããŠãããŸãã
颿°toPointã®å宣èš
1è¡ãã¯ã颿°ã®å宣èšã§ãã
toPoint颿°ã®å Žåã¯ããCardåã®å€ãåãåããIntã®ãªã¹ã[Int]ãè¿ã颿°ããšããæå³ã«ãªããŸãã
toPoint :: Card -> [Int] -- 颿°ã®åã®å®£èš
颿°ã®æ¬äœããã¿ãŒã³ãããã§å®çŸ©ãã
颿°ã®å宣èšããäžã®3è¡ããå®éã®é¢æ°ã®å®çŸ©ã§ãïŒã¡ãªã¿ã«ã颿°ã®å宣èšãšå®çŸ©ã¯ãåããã¡ã€ã«å ã«ããã°é¢ããç®æã«ãã£ãŠãåé¡ãããŸããïŒã
toPoint A = [1, 11] -- Aã®å Žåã¯1ãš11ãåãåŸã toPoint (N n) = [n] -- éåžžã®æ°åã®ã«ãŒãã§ããã°ãã«ãŒãã«æžãããæ°åã®ã¿ãåãåŸã toPoint _ = [10] -- ãã®ã»ãã®å Žåã¯10ã®ã¿ããšã
toPoint ... = ...ãšæžãããè¡ã3ã€ãããããšãããtoPoint颿°ã®å®çŸ©ã3ã€ãããããã«èŠããŠãæåã¯ã¡ãã£ãšå€ã«æãããããããŸããã
ããããå
ã»ã©ååã ãç»å Žãããã¿ãŒã³ãããã®æ§æã§ãïŒçäŸ¡ãªæžãæ¹ãã»ãã«ãããã€ãããã®ã§ããã®ãã¡ã®1ã€ã§ãïŒã
äžèšã®å®çŸ©ã§ã¯ããã¿ãŒã³ãããã䜿ãããšã§ãCardåãåãå€ã«å¿ããŠè¿ãå€ãå€ããããã«æ¯ãåããŠããŸãã
1è¡ãããèŠãŠãããŸãããã
toPoint A = [1, 11] -- Aã®å Žåã¯1ãš11ãåãåŸã
ãã®è¡ã¯ãã第1åŒæ°ãšããŠåãåã£ãå€ããCardåã®å€ã³ã³ã¹ãã©ã¯ã¿ãŒã®ãã¡Aã§ããã°[1, 11]ãè¿ãããšããæå³ã§ãã
toPoint颿°ã®å宣èšã§ã¯ãIntã®ãªã¹ã[Int]ãè¿ãããšããŸãããã確ãã«[1, 11]ïŒ1ãš11ãå
¥ã£ããªã¹ãïŒãè¿ããŠããŸããã
ãã®äžã®2è¡ã¯ãåãåã£ãåŒæ°ãAã§ãªãã£ãå Žåã«äœ¿çšãããŸãã
toPoint (N n) = [n] -- éåžžã®æ°åã®ã«ãŒãã§ããã°ãã«ãŒãã«æžãããæ°åã®ã¿ãåãåŸã toPoint _ = [10] -- ãã®ã»ãã®å Žåã¯10ã®ã¿ããšã
ãã®ããã«ãå€ã³ã³ã¹ãã©ã¯ã¿ãŒã®çš®é¡ã«å¿ããŠè¿ãå€ãæ¯ãåãããšããã®ãããã¿ãŒã³ãããã®çšéã®1ã€ã§ãã
æç¶ãåã®èšèªã§ããã°ã次ã®ãããªifæãšäŒŒãããšãããŠãããšãããã§ãããïŒäžèšã¯ç¹å®ã®èšèªã®æ§æã§ã¯ãªããç䌌ã³ãŒãã§ãïŒã
function toPoint(x) {
if (x == A) {
return [1, 11]
} else if (...) {
...
}
}
ãããããŠãå®çŸ©ã®2è¡ããèŠãŠãããŸãããã
2è¡ãã§ã¯ãå€ã³ã³ã¹ãã©ã¯ã¿ãŒãNã®å Žåã«è¿ãå€ãå®çŸ©ããŠããŸãã
toPoint (N n) = [n] -- éåžžã®æ°åã®ã«ãŒãã§ããã°ãã«ãŒãã«æžãããæ°åã®ã¿ãåãåŸã
è¿ãå€ã¯[n]ãã€ãŸãnã ããå«ããªã¹ããšãªã£ãŠããŸãããããŠãã®nã¯ã©ãããããäœã®å€ã§ãããïŒ
çãã¯ãåŒæ°ã®ç®æã«æžãããŠãã(N n)ã®nã§ãã
ããã¯ãŸãã«ãå€ã³ã³ã¹ãã©ã¯ã¿ãŒNã«äžããåŒæ°ã§ãã
äŸãã°N 2ã§ããã°nã¯2ãšãªããŸãããN 5ã§ããã°nã¯5ãšãªããŸãã
ãã¿ãŒã³ãããã¯ããã®ããã«ãå€ã³ã³ã¹ãã©ã¯ã¿ãŒã®çš®é¡ããšã«åå²ããã ãã§ãªããå€ã³ã³ã¹ãã©ã¯ã¿ãŒã«äžããåŒæ°ïŒããããã£ïŒãåãåºããšããçšéã«ã䜿ããŸãã åã«ãå€ã³ã³ã¹ãã©ã¯ã¿ãŒã®åŒæ°ã¯ããããã£ã®ãããªãã®ã ããååããªããŠãããããšèª¬æããŸããããããã§ãããããã£ã«ååããªããŠãã¢ã¯ã»ã¹ã§ããããšãåãããŸãããïŒã¡ãªã¿ã«ãååãæã£ãŠããããããã£ã§ãåãæ¹æ³ã§ã¢ã¯ã»ã¹ã§ããŸãïŒã
å®çŸ©ã®3è¡ãã®èª¬æããŸã çµãã£ãŠããŸãããããããã§ãã£ããåäœã確èªããŠã¿ãŸãããã
ãããŸã§ã«æžãã颿°ãblackjack.hsã«è¿œèšããGHCiãã:l blackjack.hsã§åã³èªã¿èŸŒãã§å®éšããŠã¿ãŸãããã
$ stack ghci > :l blackjack.hs > toPoint A [1,11] > toPoint (N 1) [1] > toPoint (N 9) [9]
仿§éããAãåãåãã°1ãš11ãè¿ããNãåãåãã°Nã«æž¡ããæŽæ°ããã®ãŸãŸè¿ãããšã確èªã§ããŸããã
ãã³ã©ã ã颿°åŒã³åºãã«ããªãããã®ã«ãã³
(N 1)ã®ããã«ãNã®é¢æ°åŒã³åºããäžžã«ãã³ã§å²ãã®ãå¿ããªãã§ãã ããã
äžžã«ãã³ã§å²ãŸãtoPoint N 3ã®ããã«åŒã³åºããŠããŸããšãäžèšã®ããã«ãšã©ãŒã«ãªããŸãã
> toPoint N 3
<interactive>:2:1: error:
⢠Couldn't match expected type âInteger -> tâ
with actual type â[Int]â
⢠The function âtoPointâ is applied to two arguments,
but its type âCard -> [Int]â has only one
In the expression: toPoint N 3
In an equation for âitâ: it = toPoint N 3
⢠Relevant bindings include it :: t (bound at <interactive>:2:1)
<interactive>:2:9: error:
⢠Couldn't match expected type âCardâ
with actual type âInt -> Cardâ
⢠Probable cause: âNâ is applied to too few arguments
In the first argument of âtoPointâ, namely âNâ
In the expression: toPoint N 3
In an equation for âitâ: it = toPoint N 3ããã¯ãHaskellã®ä»æ§äžãtoPoint N 3ãšãã颿°åŒã³åºãã¯ããtoPoint颿°ã«2ã€ã®åŒæ°Nãš3ãæž¡ããããšããæå³ã§è§£éãããŠããŸãããã§ãã
æ
£ããªããã¡ã¯ãã°ãã°ééããŠããŸãã®ã§ãåãšã©ãŒãåºãéã¯çã£å
ã«çããšããã§ãããã
ç¹ã«ãäžèšã®ããã«expected typeãactual typeã®ã©ã¡ããã颿°ïŒInt -> Cardã®ããã«ç¢å°ãå«ãŸããŠããïŒã§ãããäžæ¹ã颿°ã§ãªãåã®å Žåãç¹ã«ãã®å¯èœæ§ãé«ãã§ãã
CardãçŽååã«ããããšã®å¹èœ
Cardåã§ã¯ã5ã€ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã®ãã¡ãNã ããã«ãŒãã®æ°åã衚ãIntåã®ããããã£ãæã£ãŠããã®ã§ããã
ãã®ããããã¿ãŒã³ãããã§ã»ãã®å€ã³ã³ã¹ãã©ã¯ã¿ãŒããå€ãåãåºãããšããŠããåœç¶ãšã©ãŒã«ãªããŸãã
ããã詊ããŠã¿ãŸãããã
颿°ã®å®çŸ©ã§Aã®ã«ãŒãã«å¯Ÿå¿ããäžèšã®è¡ãâŠâŠ
toPoint A = [1, 11]
次ã®ããã«æžãæããŠã¿ãŠãã ããã
toPoint (A n) = [1, 11]
ãããããå床:l blackjack.hsããŠã¿ãŸãããã
> :l blackjack.hs [1 of 1] Compiling BlackJack ( blackjack.hs, interpreted ) blackjack.hs:230:10: error: ⢠The constructor âAâ should have no arguments, but has been given 1 ⢠In the pattern: A n In an equation for âtoPointâ: toPoint (A n) = [1, 11] Failed, modules loaded: none.
äžå¯§ãªãšã©ãŒã¡ãã»ãŒãžãåºãŸããããšã©ãŒã¡ãã»ãŒãžãæ¥æ¬èªã«èš³ããšä»¥äžã®ãããªæãã§ããããã
- ã³ã³ã¹ãã©ã¯ã¿ãŒ 'A' ã¯åŒæ°ãæã£ãŠããªãã¯ããªã®ã«1åäžããŠããŸãã
- çºçãããã¿ãŒã³: A n
'toPoint' 颿°ã«ãããçåŒãtoPoint (A n) = [1, 11]ãã«ãŠçºçã
æåéãããåŒæ°ãæã£ãŠããªãå€ã³ã³ã¹ãã©ã¯ã¿ãŒã«åŒæ°ãæž¡ãããããšãæããŠãããŠããŸãã
ããã¯ãçŽååã䜿ã£ãŠãå€ã³ã³ã¹ãã©ã¯ã¿ãŒãNã®ãšãã ãããããã£ãä¿æã§ããããã«ããããšã«ãã广ã§ãã
çŽååããµããŒãããªãèšèªã§ã«ãŒããåçŽã«è¡šçŸããããšãããšããæ°åãåããªãAãJãQãKã®åå€ã§ã¯ãããããã£ãšããŠnullã代å
¥ããããšãã£ã察å¿ãããããšã«ãªãã§ãããã
ãã®çµæãæ°åãåããªãå€ããééããŠæ°åãååŸããããšããŠããŸããæå³ããnullãåç
§ããŠããŸãåå ãäœã£ãŠããŸããããããŸããã
Haskellã§ã¯ãçŽååã®ãããã§ãæ¬åœã«å¿ èŠãªã±ãŒã¹ã®ã¿ã«ããããã£ãä»äžã§ããŸãã ããã«ãããç¡é§ãªã³ãŒããæé€ã§ããã ãã§ãªããããããééãã®å¯èœæ§ãæªç¶ã«æé€ã§ããã®ã§ãã
ãäœã§ããããã«ããããããã«ã¯
ããŠãtoPoint颿°ã®å®çŸ©ãæ®ã1è¡ã§ãã
ãããŸã§è§ŠããŠããªãã£ãäžèšã®è¡ã«ã€ããŠèª¬æããŸãããã
toPoint _ = [10] -- ãã®ã»ãã®å Žåã¯10ã®ã¿ããšã
Aãšæ°åãæžãããã«ãŒããé€ããšãæ®ã£ãŠããã«ãŒãã®åã¯JãQãKã§ãã
ãã®ããšããå¯ãããããšãããããã¯toPoint颿°ãAã§ãNã§ããªãJãQãKã®ãããããåãåã£ãå Žåã«å¯Ÿå¿ããå®çŸ©ã§ãã
ãã®å Žåã®è¿ãå€ã¯ã[10]ïŒ10ã ããå
¥ã£ããªã¹ãïŒã§ããã
GHCiäžã§è©ŠããŠã¿ãŸãããã
> toPoint J [10] > toPoint Q [10] > toPoint K [10]
ã§ããã©ãããŠãããªçµæãåŸãããã®ã§ããããïŒã
toPoint _ = [10]ãšããå®çŸ©ã®ãã¡ãtoPointã颿°åãã€ã³ãŒã«ããåŸãã®[10]ãè¿ãå€ã衚ããŠããã®ã¯åãããšæããŸãããã€ã³ãŒã«ã®å·ŠåŽã«åºãŠããã¢ã³ããŒã¹ã³ã¢_ãè¬ã§ãããã
ãã®ã¢ã³ããŒã¹ã³ã¢ã¯ãä»®åŒæ°ã§ãã
ãä»®ããªã®ã§ãã¢ã³ããŒã¹ã³ã¢ã§ãªããšãããªãããã§ã¯ãªããé©åœãªã¢ã«ãã¡ãããã®å°æåã§ãåãã¯ããŸãã
詊ãã«ãå®çŸ©ãäžèšããããã«æžãæããŠ:l blackjack.hsããtoPoint Jãªã©ã®çµæã詊ããŠã¿ãŠãã ããã
åäœã¯å€ãããªãã¯ãã§ãã
toPoint n = [10] -- ãã®ã»ãã®å Žåã¯10ã®ã¿ããšã
ãã¿ãŒã³ãããã§å€ã³ã³ã¹ãã©ã¯ã¿ãŒããšã«åŠçãæ¯ãåãããšããä»®åŒæ°ãã¢ã«ãã¡ãããå°æåãŸãã¯ã¢ã³ããŒã¹ã³ã¢ã§å§ãŸãèå¥åã®å Žåã«ã¯ãïŒåŒæ°ãšããŠå®£èšããåã«å¯ŸããïŒä»»æã®å€ã³ã³ã¹ãã©ã¯ã¿ãŒã«ãããããããã«ãªããŸãã ãããã¯ã€ã«ãã«ãŒããã¿ãŒã³ãšåŒã³ãŸãã
ïŒã¡ãªã¿ã«ãå
ã»ã©ã®toPoint (N n)ã®å®çŸ©ã§äœ¿çšããnãä»»æã®Intã«ãããããã¯ã€ã«ãã«ãŒããã¿ãŒã³ã§ãããããŠãåç¯ã§å®çŸ©ããbmi颿°ã®ä»®åŒæ°heightãweightããããããä»»æã®å€ã«ããããããã¿ãŒã³ã§ããïŒ
ã§ã¯ãçè ã¯ãªããã®ä»®åŒæ°ã®ååãã¢ã«ãã¡ãããå°æåã§ã¯ãªãããããŠã¢ã³ããŒã¹ã³ã¢ã«ããã®ã§ãããïŒã å®ã¯ãã¢ã³ããŒã¹ã³ã¢ãååã®å é ã«ã€ããŠããä»®åŒæ°ã倿°ã¯ã仿§äžã¡ãã£ãšçšéãå€ãã£ãŠããŠãã颿°ã®å®çŸ©å ã§åç §ããªãä»®åŒæ°ããšããŠäœ¿ãããšã«ãªã£ãŠããã®ã§ãã
ãã®çšéã®ä»®åŒæ°ã«ã¢ã³ããŒã¹ã³ã¢ã䜿ãããšã¯ãGHCã§ãæšå¥šããŠããŸãã
詊ãã«ãGHCiäžã§:set -Wallãšå
¥åããŠèŠåãæå¹ã«ããŠãããå
ã»ã©ä¿®æ£ããblackjack.hsãèªã¿çŽããŠã¿ãŠãã ããã
èªã¿çŽãã«ã¯ãäžèšã®ããã«ãGHCiã®:rã³ãã³ãã䜿ããŸãã
> :set -Wall [*BlackJack] > :r [1 of 1] Compiling BlackJack ( blackjack.hs, interpreted ) blackjack.hs:232:9: warning: [-Wunused-matches] Defined but not used: ânâ Ok, modules loaded: BlackJack.
ä»åºŠã¯èŠåïŒwarningïŒãåºãŸããã
ååãã¢ã³ããŒã¹ã³ã¢ã§å§ãŸã£ãŠããªãä»®åŒæ°ã颿°ã®å®çŸ©å
ã§äœ¿çšãããŠããªãå ŽåãGHCã¯ããnã䜿çšããŠããªããã©ããã®ïŒããšèŠåãåºããŠãããã®ã§ãã
_ã_nã®ããã«ã¢ã³ããŒã¹ã³ã¢ã§å§ãŸãä»®åŒæ°åãã€ããããšã«ãã£ãŠãæç€ºçã«ããã®ä»®åŒæ°ã¯äœ¿çšããªãããšããæå³ã瀺ããŸãã
Haskellã§ããã°ã©ã ãæžããšãã¯ãç©æ¥µçã«ãã®ãããªæ
£äŸã«åŸãããã«ããŸãããã
以äžã§ãtoPoint颿°ã®å®çŸ©ã¯å®äºã§ãã
ãããŸã§èª¬æãããã¿ãŒã³ãããã«ãã颿°å®çŸ©ã®æ¹æ³ãäžèšã®å³ã«ãŸãšããŠãããŸãã
ãã¿ãŒã³ãããã䜿ã£ã颿°ã®å®çŸ©
toPoint颿°ãããã£ãŠããã¿ãŒã³ãããã®ç¹åŸŽãç¥ã
次ã®é¢æ°ãå®çŸ©ããåã«ãtoPoint颿°ã®å®çŸ©ãå°ãããã£ãŠã¿ãããšã§ãããå°ããã¿ãŒã³ãããã«ã€ããŠã®çè§£ãæ·±ããŸãããã
Haskellã®ãã¿ãŒã³ããããããã«ééããé²ãããã°ã®å°ãªãããã°ã©ã äœãã«æå¹ããåããã¯ãã§ãã
ãŸãããããŸã§ã®ãŸãšããšããŠããã¿ãŒã³ãããã«é¢ããŠäžèšã®2ç¹ãæŒãããŠãããŠãã ããã
- ããããã£ããªãå€ã³ã³ã¹ãã©ã¯ã¿ãŒããããããã£ãåãåºãããšããŠãããšã©ãŒã«ãªã
- å°æåã§å§ãŸãåŒæ°åã䜿çšããããšã§ãã©ã®å€ã³ã³ã¹ãã©ã¯ã¿ãŒã«ãããããããã¿ãŒã³ïŒã¯ã€ã«ãã«ãŒããã¿ãŒã³ïŒãäœãã
ããã§ã¯ãå
ã»ã©ãšåæ§ã«GHCiãèµ·åããŠããã¿ãŒã³ããããŸãããããããå®éšããŠã¿ãŸãããã
ä»åºŠã¯:set -Wallãå
¥åããèŠåãæå¹ã«ããŠããblackjack.hsãèªã¿èŸŒãã§ãã ããã
èŠåãæå¹ã«ããªããã°æ€åºã§ããªãåé¡ãæ¢ãåºãããã§ãã
$ stack ghci > :set -Wall > :l blackjack.hs
ãã¿ãŒã³ãããã§ã¯ãããããã¿ãŒã³ãæ³å®ããªããã°ãªããªã
æå§ãã«ãtoPoint颿°ã®toPoint _ = [10]ã®è¡ãåé€ããŠã¿ãŸãããã
äžèšã®ããã«æžãæããŠãã ããã
toPoint :: Card -> [Int] toPoint A = [1, 11] toPoint (N n) = [n]
ä¿®æ£ããblackjack.hsãèªã¿çŽããšã次ã®ãããªèŠåãåºãŸãã
[1 of 1] Compiling BlackJack ( blackjack.hs, interpreted ) blackjack.hs:230:1: warning: [-Wincomplete-patterns] Pattern match(es) are non-exhaustive In an equation for âtoPointâ: Patterns not matched: J Q K
ããã¿ãŒã³ããããç¶²çŸ
çã§ãªãããããªãã¡æãæŒãããããïŒãšããèŠåã§ãã
å
·äœçã«ã©ããããã¿ãŒã³ãç¶²çŸ
ããŠããªãããŸã§æããŠãããŸããã
å€ã³ã³ã¹ãã©ã¯ã¿ãŒJãQãKãæž¡ããå Žåãæ³å®ã§ããŠããªãããã§ãã
ã§ã¯ãã®ãæ³å®ããŠããªãå€ãããtoPoint颿°ã«ãæ³å®ããŠããªãå€ãæž¡ãããäœãèµ·ããã§ããããïŒ
> toPoint K *** Exception: blackjack.hs:(230,1)-(231,19): Non-exhaustive patterns in function toPoint
Exceptionãããªãã¡äŸå€ãçºçããŠããŸããŸããã
æ³å®ããŠããªãå€ãããªãã¡äŸå€çãªå€ãäžããŠããŸã£ããããæåéãäŸå€ãèµ·ããã®ã§ãã
ã»ãã®ããã°ã©ãã³ã°èšèªã«ããããnullã®ãããªå€ãã€ãŸããã©ããªåã®å€ã®ä»£ããã«ããªãå€ãããªãHaskellã§ã¯ããã¿ãŒã³ãããã§æ³å®ããŠããªãå€ãåãåã£ã颿°ã¯ãæ»ãå€ãšããŠè¿ãå€ã決ããããšãã§ããªãã®ã§ãäŸå€ãæããã»ããããŸããã
ãã®ãããååãšããŠãããã颿°ã¯ããã¿ãŒã³ãããã§åŒæ°ãšããŠåãåŸãå€ããã¹ãŠæ³å®ããããšãæãŸãããšãããŠããŸãã
å®è¡æã«äŸå€ãèµ·ãããšããã°ã©ã ã¯åŒ·å¶çµäºããŠããŸãããŠãŒã¶ãŒäœéšãããã°ã©ã ã®ä¿¡é Œæ§ãèããæããããšã«ãªã£ãŠããŸããŸãã
ã§ããã ãæªç¶ã«é²ããããã®ã§ãããã
äžèšã®èŠåã¯ãããããã¿ãŒã³ãããã®æ³å®æŒãã«ããäŸå€ãé²ãããã®ãã®ã§ãã
ãã¿ãŒã³ãããã§ã¯äœåãªãã¿ãŒã³ãæ³å®ããŠã¯ãããªã
ä»åºŠã¯ãtoPoint颿°ã®toPoint _ = [10]ã®è¡ãtoPoint A = [1, 11]ãããåã«ç§»åãããŠã¿ãŸãããã
äžèšã®ããã«æžãæããŠãã ããã
toPoint :: Card -> [Int] toPoint _ = [10] toPoint A = [1, 11] toPoint (N n) = [n]
blackjack.hsãä¿åããäžã§ããäžåºŠGHCiã§èªã¿èŸŒããšã次ã®ãããªèŠåãåºãã¯ãã§ãïŒäžèšã«ç€ºããã®ã¯å®éã®åºåããã®æç²ã§ãïŒã
> :r blackjack.hs:231:1: warning: [-Woverlapping-patterns] Pattern match is redundant In an equation for âtoPointâ: toPoint A = ... blackjack.hs:232:1: warning: [-Woverlapping-patterns] Pattern match is redundant In an equation for âtoPointâ: toPoint (N n) = ...
âtoPointâ: toPoint A = ...ãšãâtoPointâ: toPoint (N n) = ...ã®ãã¿ãŒã³ããããåé·ã ããšããèŠåã§ãã
ãªãããšãããšããã¿ãŒã³ããããããŠããæåã®è¡ã§ä»»æã®åŒæ°ã«ããããããã¯ã€ã«ãã«ãŒããã¿ãŒã³ã䜿çšããŠããããã§ãã
ãã¿ãŒã³ãããã¯ã»ãã®ããããããã°ã©ãã³ã°èšèªã«ãããifæãswitchæãªã©ãšåæ§ã«ãè©äŸ¡ãããã¿ãŒã³ããäžããé ã«ããããªãã¡ãã¿ãŒã³ãããããè¡ãå®çŸ©ããé ã«è©äŸ¡ããŸãã
çµæããã¿ãŒã³ãããã®æåã®è¡ã§ããããå€ãã¯ã€ã«ãã«ãŒããã¿ãŒã³ã«ãããããŠããŸãããã以éã®ãã¿ãŒã³ãããã®è¡ãè©äŸ¡ãããªãã®ã§ãã
詊ãã«æžãæããtoPoint颿°ã䜿ã£ãŠã¿ããšããã®ããšãããåãããŸãã
> toPoint A [10] > toPoint (N 2) [10] > toPoint J [10]
AãäžããããšNãäžããããšãtoPoint _ = [10]ã®è¡ã§_ãä»»æã®å€ã³ã³ã¹ãã©ã¯ã¿ãŒã«ãããããŠããŸãããã[10]ãè¿ã£ãŠããŸããŸãã
å®éåé¡ããã¯æããã«æå³ããªãæ¯ãèãã§ãããã
éåžžã®ifæïŒãããã¯ifåŒïŒãªã©ãšç°ãªãããã¿ãŒã³ãããã¯ããã®ããã«ããããããé çªãééããéã«ã§ããŠããŸãããäœåãªãã¿ãŒã³ããç°¡åã«æ€åºããããšãã§ããŸãã
ãã®ããã«ãã¿ãŒã³ãããã¯ãåŠçã®ç¡é§ãæ€åºããããåãåŸãå€ã®æ³å®ã«æŒããããããšãæ€åºããããšã§ãå®è¡ãããŸã§ããªããã°ãæ€åºããããšãã§ããŸãã
ïŒããããæŽå²çãªçµç·¯ã«ãã£ãŠïŒæ®å¿µãªããä»å玹ä»ããæ€åºæ©èœã¯èŠåããªã³ã«ããªããšäœ¿çšã§ããŸããã®ã§ãã¿ãªããå®éã«éçºããéã¯å¿
ã-Wallãªãã·ã§ã³ããèŠåããšã©ãŒãšããŠæ±ã-Werrorãæå¹ã«ããŠéçºããŠãã ããã
Cardåã䜿ã£ã颿°ãäœã ãã®2 sumHand颿°
åç¯ã®toPoint颿°ã䜿ã£ãŠãææã®åèšãèšç®ãã颿°sumHandãæžããŸãããã
sumHandã¯ãæåã«èãããšãããæ¬¡ã®ãããªåã®é¢æ°ã§ãã
sumHand :: [Card] -> Int
ãã®é¢æ°ããæ¬¡ã®ãããªæé ã§åŠçãããããã«å®çŸ©ãããã®ã§ããã
- ææã®åã«ãŒãããåãåŸãå€ã«å€æãã
- åãåŸãå€ã®çµã¿åãããã¹ãŠã«ã€ããŠãããããåèšãæ±ãã
- åèšã®ãã¡ããã¹ãããªãïŒåèšã21ãè¶ ããªãïŒãã®ã®ã¿ãéžã¶
- ãã¹ãããªãåèšã1ã€ã§ããã£ãå Žåããã®äžããæãé«ãå€ã®åèšãéžãã§è¿ã
- ãã¹ãããªãåèšã1ã€ããªãå ŽåïŒã©ã®åèšããã¹ãããŠããŸãïŒãåèšã®äžããé©åœãªãã®ãéžãã§è¿ãïŒããã§ã¯ããªã¹ãã®å é ããéžã¶ãã®ãšããŸãïŒ
ãã§ã«1ã€ç®ã®æé ã«å¿
èŠãªé¢æ°ã¯toPointãšããŠå®çŸ©ãã¿ã§ãã
ææã«å
¥ã£ãåã«ãŒããåãåŸãå€ã®çµã¿åããããã¹ãŠäœããããããã®åèšãæ±ããã«ã¯ãã©ãããã°ããã§ããããïŒ
æç¶ãåã®èšèªã«æ
£ããŠãããšãforæã®ãããªç¹°ãè¿ãåŠçãããããã®å¶åŸ¡æ§é ãäœ¿ãæ¹æ³ãçã£å
ã«æãæµ®ãã¶ãããããŸããã
ãšããããå®ããããšHaskellã«ã¯ãforæãwhileæãforeachæã®ãããªç¹°ãè¿ãã«äœ¿ãæ§æã¯ãªãã®ã§ãïŒïŒä»åã¯ç޹ä»ããŸããããå®ã¯ã©ã€ãã©ãªãŒã®é¢æ°ãšããŠã¯ååšããŸãïŒ
ãã®ãããªç¹°ãè¿ããè¡ã颿°ã¯ãåºæ¬çã«ã¯ååž°åŒã³åºãã䜿ã£ãŠå®çŸ©ã§ããŸãã ãã ãHaskellã§ã¯ãã³ãŒããè€éã«ãªããã¡ãšããããšããããååž°åŒã³åºããçŽæ¥äœ¿ã£ãŠé¢æ°ãå®çŸ©ããããšã¯å®è·µã§ã¯ããŸããããŸããã 代ããã«ãååž°åŒã³åºããããŒã¹ã«äœã£ã䟿å©ãªé¢æ°ãããããæäŸãããŠããã®ã§ããããã䜿ãã®ãHaskellã§ã¯äžè¬çã§ãã ããããçµã¿åãããã ãã§ããã»ã©ã®ããšããªãéããããããããšã¯ååã«å®çŸã§ããã®ã§ãã
ããã§ã¯ããããã®äŸ¿å©ãªé¢æ°ã®äžéšããsumHand颿°ãäœãéçšãéããŠç޹ä»ããŠãããŸãã
map: ãªã¹ãã®åèŠçŽ ã«å¯ŸããŠé¢æ°ãå®è¡ããçµæããŸããªã¹ãã«å
¥ãã
æåã«ç޹ä»ããã®ã¯map颿°ã§ããmapã¯ãææã®åã«ãŒãã«å¯ŸããŠåãåŸãå€ãããããèšç®ããã®ã«ãŽã£ãããªé¢æ°ã§ãã
ãã®ãããªããªã¹ãã®åèŠçŽ ã«å¯ŸããŠäœããããåŠçãæç¶ãåèšèªã§æžããšããããäŸãã°äžèšã®ãããªã³ãŒãã«ãªãã§ããããïŒ
// çµæãæ ŒçŽããããã®æ°ãããªã¹ã result = []; for(card in cards){ // åã«ãŒãã«å¯ŸããŠã // toPoint颿°ãå®è¡ããçµæãã point = toPoint(card); // çµæãæ ŒçŽãããªã¹ãã«è¿œå ããŠãã result.push(point); } // æçµçã«ãã¹ãŠã®cardã远å ããresultããtoPoint颿°ã§å€æãããªã¹ãã«ãªãã return result;
ãã®ãããªãããªã¹ãã®åèŠçŽ ã«å¯ŸããŠé¢æ°ãå®è¡ãããã®çµæãæ°ãããªã¹ãã«è¿œå ããŠããããšããåŠçã¯ãHaskellã«éããå€ãã®ããã°ã©ãã³ã°èšèªã§é »ç¹ã«å¿ èŠã«ãªããŸãã ã¿ãªãããããããšãã䌌ãåŠçãããããŸã§ã«äœåºŠãæžããŠããã®ã§ã¯ãªãã§ããããïŒ
ããã䌌ãåŠçããªããæœè±¡åããŠäœ¿ããŸããã圢ã«ãŸãšããããã¯ãã§ãã
å®éãäžèšã®foræãã»ãã®äŒŒããããªåŠçã«äœ¿ããããšãã¯ã次ã®éšåã ããæžãæããã°ããããã§ãã
// toPoint颿°ãå®è¡ããçµæãã point = toPoint(card);
ãã®éšåãæžãæããããããã«ãäžèšã®foræã§ãã£ãŠããåŠçãæœè±¡åããã®ããmap颿°ã ãšãããŸãã
Haskellã¯ããããã颿°åããã°ã©ãã³ã°èšèªãã§ããã颿°ããã¡ãŒã¹ãã¯ã©ã¹ãªããžã§ã¯ããšããŠæ±ããã®ã§ã
ãtoPoint颿°ãå¥ã®é¢æ°ã«å·®ãæ¿ããããšãã£ãããšãå¯èœãªã®ã§ãã
颿°ããã¡ãŒã¹ãã¯ã©ã¹ãªããžã§ã¯ããšããŠæ±ããèšèªã¯ã»ãã«ãæ°å€ãããããã¯ãmapãšããååã§åãä»çµã¿ãæäŸãããŠããããšãå€ãã®ã§ã芪ãã¿ã®ããæ¹ãå€ãã§ãããã
Haskellã®mapã䜿ããææã®åã«ãŒãã«å¯ŸããŠåãåŸãå€ãtoPointã§èšç®ããã«ã¯ã次ã®ããã«ããŸãã
$ stack ghci > :l blackjack.hs > map toPoint [A, N 2, J, N 3] [[1,11],[2],[10],[3]]
ææã衚ããªã¹ããšããã®åèŠçŽ ã§ããã«ãŒãã®å€ã®é¢ä¿ãå³ã«ãããšã以äžã®ããã«ãªã£ãŠããŸãã
[ A , N 2, J , N 3] â â â â [[1,11], [2] , [10], [3]]
ãªã¹ãã®åèŠçŽ ãtoPoint颿°ã®åŒæ°ãšããŠæž¡ããå®è¡ããçµæãããŸããªã¹ãã«æ ŒçŽãããã®ãåããã§ããããïŒã
map颿°ã䜿ãããšã§ãããªã¹ãã®åèŠçŽ ã«å¯ŸããŠé¢æ°ïŒãã®äŸã§ã¯toPointïŒãå®è¡ããããšãããããµãããã¿ãŒã³ãç°¡æœã«å®è£
ã§ããã®ã§ãã
letã§ããŒã«ã«å€æ°ã«é¢æ°ã®å®è¡çµæãä¿åãã
åé
ã§ã¯ãmap颿°ã§ææã«å
¥ã£ãåã«ãŒããããåãåŸãå€ãèšç®ããŸããã
次ã®åŠçã説æããåã«ããã£ããèšç®çµæãããŒã«ã«å€æ°ã«ä¿åããæ¹æ³ã説æããŠãããŸãããã
ããŒã«ã«å€æ°ã«ä¿åããããšã§ãäœåºŠãåãèšç®ãããã®ãåé¿ããããããŒã«ã«å€æ°ãšããŠååãã€ããããšã§æå³ãåãããããããããšãã§ããã®ã¯ãHaskellã§ãåæ§ã§ãã
Haskellã§ããŒã«ã«å€æ°ãå®çŸ©ããæ§æã¯2ã€ãããŸãã
ä»åã¯ãã®ãã¡ã®1ã€ãletã玹ä»ããŸãããã
letã¯äžèšã®åœ¢åŒã§äœ¿çšããŸãã
let 倿°å1 = ... 倿°1ã®å®çŸ© ... 倿°å2 = ... 倿°2ã®å®çŸ© ... ... 倿°åN = ... 倿°Nã®å®çŸ© ... in å®çŸ©ãã倿°ã䜿çšããåŒ
äŸã§èª¬æããŸãããã
ãã ãããŸãŸã§ã®ããã«GHCiã§è©ŠãããšããŠããäžèšã®ãããªæ¹è¡ãå«ãã ã³ãŒãã¯å
¥åã§ããŸããã
GHCiã§è€æ°è¡ã®åŒãå
¥åããå Žåã¯ã:{ã§ã¯ãããŠã:}ã§çµããŠãã ããïŒãªãã ã顿åã¿ããã§ããïŒã
GHCiã«:{ãšå
¥åããŠãªã¿ãŒã³ããŒãæŒããšãããã©ã«ãã§ã¯ããã³ããã瞊æ£|ã«å€ãããŸãã
ãã®ç¶æ
ã§ãlet ...ã§å®çŸ©ããã倿°åãšå®çŸ©ãåæããin以éã§ãã®å€æ°ã䜿çšããåŒãæžããŠã¿ãŠãã ããã
äžèšã®äŸã®ããã«ãåãlet ...ã®äžã§å®çŸ©ãã倿°ã¯ãïŒin以éã ãã§ãªãïŒã»ãã®å€æ°ã®å®çŸ©ã«ãããŠãåç
§ã§ããŸãã
> :{ | let x = 1 | y = x * 2 | in | x + y > :} 3
letã§å®çŸ©ãã倿°ãåç
§ã§ããç¯å²
ã¡ãªã¿ã«ã1è¡ã§æžãããå Žåã¯ã»ãã³ãã³;ã䜿ããŸãã
> let x = 1; y = x * 2 in y 2
sumHand颿°ã§letã䜿ããææã®åã«ãŒãã«mapã§toPointããçµæãä¿åããŠã¿ãŸãããã
çµæã¯ãåãåŸãå€ã®ãªã¹ãããªã®ã§ãpossiblePointsãšããååã®å€æ°ã«ä»£å
¥ããããšã«ããŸãã
sumHand :: [Card] -> Int sumHand cards = let possiblePoints = map toPoint cards ... ãããªãéäžã®å€æ° ... in ...
ããããå ã¯ãã... ãããªãéäžã®å€æ° ...ããäœãæ¹æ³ã«ã€ããŠèª¬æããŠãããŸãã
foldl: ããããŸã§ã«åŠçããèŠçŽ ãã®æ
å ±ã䜿ããªãããªã¹ãã倿ãã
次ã«å®è£ ããã®ã¯ãåãåŸãå€ãã¹ãŠãçµã¿åãããŠãçµã¿åããããšã«åèšãæ±ãããåŠçã§ãã ãšã¯ããããã®ãŸãŸã ãšã¡ãã£ãšè€éã§ããã
åŠçã®å
容ãããã«åè§£ããç°¡åãããªãåèšãæ±ãããã®éšåããèããŠã¿ãããšã«ããŸãããã
åã«ãæŽæ°ã®ãªã¹ãã®åèšãæ±ãããã ãã§ããã°ãHaskellã«ã¯æšæºã§sum颿°ãšããã®ãããã®ã§ãããã䜿ãã ãã§ãã
ããããä»åã¯ãåãåŸãç¹æ°ãã¹ãŠãçµã¿åãããŠãçµã¿åããããšã«ãæ±ããªããã°ãªããªããããsum颿°ã§ã¯åçŽãããŠåœ¹ã«ç«ã¡ãŸããã
ããã§ãæå§ãã«sum颿°ã1ããå®è£
ããŠã¿ãŠããã®éçšããã³ãã«ããŠç®çã®åèšãæ±ãã颿°ãžãšçºå±ãããŠããããšããã¢ãããŒãããšãããšã«ããŸãã
sum颿°ã®å®è£
ã«äœ¿ãã®ãããã®ç¯ã®ã¿ã€ãã«ã«ããªã£ãŠããfoldlïŒããã©ãŒã«ãã»ãšã«ããšèªã¿ãŸãïŒé¢æ°ã§ãã
ã»ãã®ããã°ã©ãã³ã°èšèªã«ããreduceãinjectãšããååã§äŒŒããããªæ©èœãçšæãããŠããå ŽåããããŸãã
foldl颿°ã¯ããªã¹ããããŸããŸãªåã®å€ã«å€æã§ãããäžèœé¢æ°ã§ãã
foldlãçè§£ããŠããã°ããªã¹ãã䜿ãå€ãã®å Žé¢ã§ååž°é¢æ°ãèªåã§æžãå¿
èŠããªããªããŸãïŒfoldlã®ä»£ããã«foldrãªã©ã®å€çš®ã䜿ãããšããããŸããããããã®çè§£ãç°¡åã«ãªããŸãïŒã
foldlã¯ããªã¹ãã«äœããæœããšããç¹ã§ã¯map颿°ã«äŒŒãŠããŸãã
ãããããªã¹ããããªã¹ããžã®å€æã«ç¹åããmap颿°ã«æ¯ã¹ããšãäœ¿çšæ¹æ³ã¯å°ãè€éã§ãééãããå¯èªæ§ãäžããããããªã¹ã¯ãé«ããªããŸãã
ç¶æ³ãèŠæ¥µããªããããªãã¹ãmapãªã©ã®çšéãããæç¢ºãªé¢æ°ã䜿çšããŸãããã
foldlã®äœ¿ãæ¹
foldl颿°ã¯ã次ã®åœ¢åŒã§åŒã³åºããŸãã
foldl <颿°> <åæå€> <ãªã¹ã>
map颿°ãšåæ§ãæåŸã®åŒæ°ã§ããããªã¹ããã¯ãåèŠçŽ ãåŠçããã察象ã®ãªã¹ãã§ãã
<颿°>ã¯ãmapã«æž¡ã颿°ãšåæ§ã«ããªã¹ãã®åèŠçŽ ãåãåãã®ã§ãããããã«å ããŠããããŸã§ã®<颿°>ã®å®è¡çµæããåãåããŸãã
å
·äœçã«ã¯ãfoldlã®ç¬¬1åŒæ°ã«ãã颿°ã¯ã次ã®åœ¢åŒã§åŒã³åºããããã®ã§ãã
<颿°> <ãããŸã§ã®å®è¡çµæ> <ãªã¹ãã®åèŠçŽ >
ãã®é¢æ°ã®2ã€ç®ã®åŒæ°ã§ãã<ãªã¹ãã®åèŠçŽ >ã¯ãæåéãfoldlã«æž¡ã<ãªã¹ã>ã®åèŠçŽ ã§ãã
ã§ã¯ã1ã€ç®ã®åŒæ°ã®<ãããŸã§ã®å®è¡çµæ>ãšã¯äœã§ããããïŒã
ãã®<ãããŸã§ã®å®è¡çµæ>ã¯ããã¿ç ããŠèšããšããçŸåšåŠçããŠãã<ãªã¹ãã®åèŠçŽ >ãã1ã€åã®èŠçŽ ã<颿°>ãåŠçãããšãã®å®è¡çµæããšããæå³ã«ãªããŸãã
ã§ããã<ãªã¹ãã®åèŠçŽ >ãã1ã€åã®èŠçŽ ãåŠçããçµæããšããããšã¯ããªã¹ãã®å
é ã®èŠçŽ ãåŠçãããšãã¯ã©ãããã°ããã®ã§ãããïŒã
ãã®å Žåã«ã¯ã1ã€åã®èŠçŽ ããªããŠãããŸããã
ããã§åºãŠããã®ããfoldl颿°ã®ç¬¬2åŒæ°ã§ãã<åæå€>ã§ãã
ãã®<åæå€>ã¯ããªã¹ãã®å
é ã®èŠçŽ ã«å¯ŸããŠ<颿°>ãå®è¡ããéã<ãããŸã§ã®å®è¡çµæ>ãšããŠ<颿°>ã®ç¬¬1åŒæ°ãšããŠæž¡ãããŸãã
foldlã¯ã«ãŒãã®æœè±¡å
ãã³ã©ã ãforæã§çè§£ããfoldl
foldlã®ãããªé¢æ°ã¯ã颿°åããã°ã©ãã³ã°ã«æ
£ããŠããªããšãã¡ãã£ãšåããã¥ãããããããŸããã
ã銎æã¿ã®foræã§èãããšã©ããªãã®ããç䌌ã³ãŒãã§èŠãŠã¿ãŸãããã
function foldl(<颿°>, <åæå€>, <ãªã¹ã>){
let <ãããŸã§ã®å®è¡çµæ> = <åæå€>;
for(<ãªã¹ãã®èŠçŽ > in <ãªã¹ã>){
<ãããŸã§ã®å®è¡çµæ> = <颿°>(<ãããŸã§ã®å®è¡çµæ>, <ãªã¹ãã®èŠçŽ >);
}
return <ãããŸã§ã®å®è¡çµæ>;
}
foldlã§ãã£ãŠããããšã¯ããæçµçãªå®è¡çµæãåæåããŠãããã«ãŒããåããŠãªã¹ãã1åãã€åŠçããæçµçãªå®è¡çµæãå°ããã€çµã¿ç«ãŠãŠããããšãããéåžžã«ãããµããå®è£
ãã¿ãŒã³ã§ãã
ãã®å®è£
ãã¿ãŒã³ãããæŽæ°ã®ãªã¹ããåãåã£ãŠããã®åèšãæ±ãã颿°ãïŒã€ãŸãsum颿°ïŒã«åœãŠã¯ããŠã¿ãã°ããããã®ããšã宿ã§ãããšæããŸãã
äžèšã®foræããŒãžã§ã³ã®foldlã§sum颿°ãå®è£
ããã«ã¯ã<颿°>ã«ã¯äžãã2ã€ã®åŒæ°ãè¶³ãåããã颿°ã<åæå€>ã«ã¯0ãåœãŠã¯ããŸãã
let <ãããŸã§ã®å®è¡çµæ> = 0;
for(<ãªã¹ãã®èŠçŽ > in <ãªã¹ã>){
<ãããŸã§ã®å®è¡çµæ> = <ãããŸã§ã®å®è¡çµæ> + <ãªã¹ãã®èŠçŽ >;
}
return <ãããŸã§ã®å®è¡çµæ>;
ããªãèŠæ
£ãããã¿ãŒã³ã«è¿ã¥ããŠãããšæããŸãããïŒã
ã<ãããŸã§ã®å®è¡çµæ> = <ãããŸã§ã®å®è¡çµæ> + <ãªã¹ãã®èŠçŽ >ãã®éšåããCèšèªãªã©ã§ãã䜿ã+=æŒç®åã«çœ®ãæãããšãããã«ã銎æã¿ã®åœ¢ã«ãªããŸãã
let <ãããŸã§ã®å®è¡çµæ> = 0;
for(<ãªã¹ãã®èŠçŽ > in <ãªã¹ã>){
<ãããŸã§ã®å®è¡çµæ> += <ãªã¹ãã®èŠçŽ >;
}
return <ãããŸã§ã®å®è¡çµæ>;
sum颿°ãfoldl颿°ããªããããªç¶æ
ã§ãããã°ã©ãã³ã°èšèªã®æšæºAPIã ãã§sumã1ããå®è£
ããããšã«ãªã£ãå Žåãããããã¯ãã®ãããªforã«ãŒããæžãããšã«ãªãã®ã§ã¯ãªãã§ããããã
ãæçµçã«çµæãšãªã倿°ãã«ãŒãã®å€ã§åæåããŠããããªã¹ãã®èŠçŽ ã1ã€ãã€åãåºããå°ããã€å€æ°ãæŽæ°ããŠãæçµçãªçµæãäœãããšãããæç¶ãåèšèªã§ãããèŠããã¿ãŒã³ãèŠäºã«æœè±¡åããããã®ããfoldlãªã®ã§ãã
æŒç®åãæ®éã®é¢æ°ãšããŠæ±ã
Haskellã®foldlã䜿ã£ãŠãsum颿°ãïŒåïŒå®è£
ããŠã¿ãŸãããã
foræããŒãžã§ã³ã®ã³ãŒãã§ãã£ãããšãæãåºããªããfoldl颿°ã®åŒæ°ãšããŠæž¡ããšã次ã®ããã«æžãæããããŸãã
plus :: Int -> Int -> int plus x y = x + y sum :: [Int] -> Int sum list = foldl plus 0 list
foldl颿°ã®åŒæ°ã¯<颿°>ã<åæå€>ã<ãªã¹ã>ã§ããã
sum颿°ãå®è£
ããã®ã§ã<åæå€>ã¯0ã<ãªã¹ã>ã¯ãã®ãŸãŸsum颿°ãåãåããªã¹ãã«ããã°ããã§ããã
<颿°>ã¯ãã2ã€ã®åŒæ°ãè¶³ãåããã颿°ãã§ãã®ã§ããã®ãããªé¢æ°ãå¥éå®çŸ©ããŠæž¡ããŠããŸãã
äžèšã®ã³ãŒãã§èšããšããã®plus颿°ã§ãã
Haskellã§ã¯ãBoolãæååãæŽæ°ãªã©ãšåæ§ã«ã颿°ããã®ãŸãŸåŒæ°ãšããŠæž¡ããã®ã§ããã®ããã«æžããŠãäœ1ã€åé¡ã¯ãããŸããã
ããŠããšããããäžèšã®ããã«æžããŠã¿ãŸããããplus颿°ã®å®çŸ©ãå¥ã«æžããªããšãããªãã®ã¯ãã¡ãã£ãšé¢åã§ãããã
ãªã«ã楜ãããæã¯ãªãã§ããããïŒ
ãã¡ããããããŸãïŒ â»
Haskellã§ã¯+ã®ãããªæŒç®åããå®ã¯ãã ã®é¢æ°ãªã®ã§ãïŒRubyã§+ãšããã¡ãœãããå®çŸ©ã§ããã®ãšåããããªãã®ã§ãããHaskellã®å Žåã+ã-ã/ã*ã®ãããªèšå·ã ãã§ãªãããã£ãšãããããªèšå·ãçµã¿åããã颿°ãäœããŸããããŸãé »ç¹ã«äœ¿ãã¹ããã®ã§ã¯ãªãã§ããïŒã
+ã颿°ãªã®ã§ãåœç¶ãfoldlã®åŒæ°ãšããŠæž¡ããŸãã
ãã ããæ§æãææ§ã«ãªã£ãŠããŸãã®ã§ããã®ãŸãŸ+ãšããèšå·ã¯æž¡ããŸããã
(+)ãšããå
·åã«ãäžžã«ãã³ã§åªããå
ãã§ãããŸãããã
äžžã«ãã³ã§å²ãŸãã(+)ã¯ãã第1åŒæ°ãšããŠ+ã®å·ŠèŸºãã第2åŒæ°ãšããŠ+ã®å³èŸºãåãåã颿°ããšãªããŸãã
詊ãã«GHCiã§äžèšã®ããã«å®è¡ããŠã¿ãŠãã ããã
> (+) 1 3 4
ãã®ããã«æŒç®åãäžžã«ãã³ã§å²ããšãã»ãã®æ®éã®é¢æ°ïŒã颿°å åŒæ°...ãã®ããã«é¢æ°åãåŒæ°ã®åã«çœ®ããŠåŒã³åºã颿°ïŒãšåãããã«äœ¿ããããã«ãªããŸãã
ãšããããã§ãfoldl颿°ã䜿ã£ãsum颿°ã®å®çŸ©ã¯ä»¥äžã®ããã«æžãæããããŸãã
sum :: [Int] -> Int sum list = foldl (+) 0 list
äœèšãªé¢æ°ãå®çŸ©ããå¿ èŠããªãããã£ããå®çŸ©ã§ããŸãããïŒ
foldlãmapã䜿ã£ãŠãåãåŸããã¹ãŠã®åèšç¹æ°ãæ±ãã
ããŠãåèšãæ±ããsum颿°ãå®çŸ©ããããšã¯ã§ããŸãããããŽãŒã«ã¯ããã§ã¯ãããŸããã§ãã
ïŒãããããHaskellã«ã¯æšæºã§sum颿°ããããŸãããïŒã
ãã«ãŒããåãåŸãç¹æ°ãã¹ãŠãçµã¿åãããŠãçµã¿åããããšã«åèšãæ±ãããã®ãããŸã®ç®æšã§ãããã
ãã®ããã«å¿
èŠãªãfoldlã«æž¡ãååŒæ°ã®åãšå€ãããããèããŠãããŸãããã
ãŸã<ãªã¹ã>ã§ãããããã¯ãããŸã§ã§map颿°ãå©çšããŠåŸããææã«ãããåã«ãŒãã®åãåŸãå€ã®ãªã¹ãã§ãã
å
·äœçã«ã¯ãletã䜿ã£ãŠpossiblePointsãšãã倿°ã«ä»£å
¥ãããã®ã§ãã
ãã®åèŠçŽ ã¯ãã«ãŒããAã®å Žåã¯[1, 11]ã3ã®å Žåã¯[3]ãšãã£ãå
·åã«ãIntã®ãªã¹ãã«ãªã£ãŠããŸãã
åŸã£ãŠãåãšããŠã¯Intã®ãªã¹ãã®ãªã¹ããããªãã¡[[Int]]ãšãªããŸãã
<åæå€>ã«ã€ããŠã¯ãfoldlã§ãªã¹ãã®åèŠçŽ ã1ã€ãã€äœ¿ããªããæçµçãªå®è¡çµæãäœããšãã«æåã«äœ¿ãå€ãªã®ã§ã
æçµçãªçµæãšåãåã§ãªããšãããŸããã
éäžã§åãå€ããããšã¯ã§ããªãã®ã§ãã
ããŸæçµçã«æ¬²ããã®ã¯ãåãåŸãå€ã®çµã¿åããããšã®åèšããªã®ã§ãåèšç¹æ°ã®ãªã¹ããããªãã¡[Int]ãšããåã«ããŸãããã
å€ãšããŠäœã䜿ãã°ãããã¯ã<颿°>ã®å€ãæ€èšããéã«èããŸãã
æåŸã«ãäžçªé£ãã<颿°>ã®éšåã§ãã
ãã®<颿°>ãåãåŒæ°ãããªãã¡<ãããŸã§ã®å®è¡çµæ>ãš<ãªã¹ãã®åèŠçŽ >ã®åã¯ã<ãªã¹ã>ãš<åæå€>ãæ±ºãŸããšèªããšæ±ºãŸããŸãã
ãŸãã<ãããŸã§ã®å®è¡çµæ>ã§ãããããã«ã€ããŠã¯ãã<åæå€>ã¯ããªã¹ãã®æåã®èŠçŽ ã«å¯ŸããŠ<颿°>ãå®è¡ããéã<ãããŸã§ã®å®è¡çµæ>ãšããŠ<颿°>ã®ç¬¬1åŒæ°ãšããŠæž¡ãããããšããç¹ãæãåºããŠãã ããã
<åæå€>ã¯<ãããŸã§ã®å®è¡çµæ>ã®ä»£ããã«ãªãã®ã§ãã
ãããã仿§ã®ããã«ãå¿
ç¶çã«<ãããŸã§ã®å®è¡çµæ>ã¯<åæå€>ã®åãšåãåãã€ãŸãä»åã®å Žå[Int]ã«ãªããŸãã
ç¶ããŠã<ãªã¹ãã®åèŠçŽ >ã¯ãæåéãfoldlã«æž¡ã<ãªã¹ã>ã®åèŠçŽ ã§ãã
<ãªã¹ã>ã®åã¯[[Int]]ã§ãããã<ãªã¹ãã®åèŠçŽ >ã®åã¯[Int]ãšãªãã®ã§ãã
foldlã«äžãã颿°ã®å
以äžã®èå¯ã®çµæã<颿°>ã®åã¯äžèšã®ããã«ãªããŸãã
:: [Int] -> [Int] -> [Int] -- ^^^^^ ^^^^^ ^^^^^ -- <ãããŸã§ã®å®è¡çµæ> <ãªã¹ãã®åèŠçŽ > <æçµçãªå®è¡çµæ>
ãããŸã§åãã£ãããå
·äœçãªåŠçã®å
容ãèããŠãããŸãããã
åçŽã«ãåèšãæ±ããããšãã®<颿°>ã¯ã<ãããŸã§ã®å®è¡çµæ>ãš<ãªã¹ãã®åèŠçŽ >ãè¶³ãåãããã ãã§ããã®ã§ããã
ä»åºŠã¯ã<ãããŸã§ã®å®è¡çµæ>ãš<ãªã¹ãã®åèŠçŽ >ã®ããããããªã¹ãã«ãªã£ãŠããããããããããåãåºããŠããè¶³ãåãããå¿
èŠããããŸãã
ãåãåŸãå€ãã¹ãŠãçµã¿åãããŠãçµã¿åããããšã«åèšãæ±ãããã«ã¯ããã¹ãŠã®çµã¿åãããç·åœããã§è¶³ãåãããªããã°ãªããŸããã
ææã®äžèº«ã[A, A, A]ã ãšãããšãåãåŸãç¹æ°ã®ãªã¹ãã¯[[1, 11], [1, 11], [1, 11]]ãšãªãã®ã§ãäžå³ã®ãããªèšç®ãè¡ããŸãã
[A, A, A]ã®ç¹æ°èšç®
å³ã®äžã§ã€ã³ãŒã«ïŒ=ïŒã®åŸãã«æžãããæ°ããåèŠçŽ å士ãè¶³ãç®ããçµæã§ãã
è¶³ãç®ã®çµæãã¹ãŠãæ ŒçŽãããªã¹ããã<颿°>ã<ãããŸã§ã®å®è¡çµæ>ãš<ãªã¹ãã®èŠçŽ >ãèšç®ããçµæãšãªããŸãã
ãã®å³ãèŠããšãã1ã€ç®ã®Aãã®åãåŸãç¹æ°ã®ãªã¹ã[1, 11]ã®åèŠçŽ ã«å¯ŸããŠãã2ã€ç®ã®Aãã®åãåŸãç¹æ°ã®ãªã¹ã[1, 11]ã®åèŠçŽ ãåãåºãããããããè¶³ãåãããŠããããšãåãããŸãã
ãšããããšã¯ãäžèšã®ããã«2éã®map颿°ã䜿ãã°çããåºãããã§ãã
ããªã¹ãã®åèŠçŽ ã«å¯ŸããŠé¢æ°ãå®è¡ããããšããmap颿°ãã2ã€ã®ãªã¹ãã«å¯ŸããŠäœ¿çšããã®ã§ãã
ãã®é¢æ°ã®ååã¯plusEachãšããŠãããŸãããã
plusEach list1 list2 = map (\element1 -> map (\element2 -> element1 + element2) list2) list1
\element1 ->ãšãããèŠæ
£ããªãæ°ããæ§æãåºãŠããŸãããã
äœ¿ãæšãŠã®é¢æ°ãå®çŸ©ããïŒã©ã ãåŒïŒ
\element1 -> ...ã\element2 -> ...ã®ããã«ãããã¯ã¹ã©ãã·ã¥ãšçްãå³åãã®ç¢å°ã䜿ã£ãæ§æã¯ããã©ã ãåŒããšãããŸãã
ãmapãªã©ã®é¢æ°ã«æž¡ãæ°ãã颿°ãå®çŸ©ããããã§ããã®ããã ãã«æ°ãã颿°ã®ååãèããŠå€æ°ã«å
¥ããã®ã¯é¢åãããããšããå Žåã«ãäœ¿ãæšãŠã®é¢æ°ãå®çŸ©ã§ããããã«ããŠãããã®ãã©ã ãåŒã§ãã
ã©ã ãåŒã®äœ¿ç𿹿³ãäžè¬åãããšæ¬¡ã®ããã«ãªããŸãã
(\ä»®åŒæ°å1 ä»®åŒæ°å2 ... ä»®åŒæ°åN -> 颿°ã®äžèº«)
\ãã->ãŸã§ããäœ¿ãæšãŠã®é¢æ°ãåãåãä»®åŒæ°åã«ãªããŸããè€æ°ã®åŒæ°ãåãåãã©ã ãåŒãå®çŸ©ãããå Žåã¯ãä»®åŒæ°åãããããã¹ããŒã¹ã§åºåããŸãã
ãã®ã©ã ãåŒã䜿ã£ãŠå®çŸ©ããplusEach颿°ã®äžèº«ãåå³ããŸãããã
map (\element1 -> map (\element2 -> element1 + element2) list2) list1
1ã€ç®ã®mapã«æž¡ãã©ã ãåŒã®äžã§ãããã«mapãåŒãã§ããŸãã
ããã«ãã£ãŠã2ã€ã®ãªã¹ãäž¡æ¹ã®ããããã®èŠçŽ ããç·åœããã§è¶³ãç®ããŠããããã§ãã
åãããããããããã«ãæ¹è¡ãšã€ã³ãã³ããå ããŠãåéšåã«èª¬æãã³ã¡ã³ããšããŠæžã蟌ãã§ã¿ãŸããã
plusEach list1 list2 = map (\element1 -> -- 1ã€ç®ã®ãªã¹ãã®åèŠçŽ ãã map (\element2 -> -- 2ã€ç®ã®ãªã¹ãã®åèŠçŽ ãšã element1 + element2 -- è¶³ãåããã ) list2 ) list1
ããããã®map颿°ã§ãlist1ãšlist2ã®ããããã®èŠçŽ ã1ã€ãã€åãåºããè¶³ãåãããŠããŸãã
map颿°ãäºéã«å
¥ãåã«ããããšã§ããlist1ã®ãã¹ãŠã®èŠçŽ ãã«ãããããããã«å¯ŸããŠãlist2ã®ãã¹ãŠã®èŠçŽ ããããããåŠçã§ããŸãã
ãªã®ã§ãçµæçã«ããã¹ãŠã®çµã¿åããããåŠçã§ããã®ã§ãã
ããªã¹ãã®ãªã¹ããã®å ¥ãåãè§£ã
ããæãã«å®çŸ©ã§ããŠãããããªã®ã§ãåäœã確èªããŠã¿ãŸãããã
äžèšã®plusEach颿°ãblackjack.hsã«è¿œèšããŠä¿åããŠããŸãGHCiãã:l blackjack.hsã§èªã¿èŸŒãã§ã¿ãŸãããã
> plusEach [1, 11] [1, 11] [[2,12],[12,22]]
1 + 1ã1 + 11ã11 + 1ã11 + 11ãšããããã¹ãŠã®çµã¿åããã«ã€ããŠåèšãèšç®ã§ããŠããŸããã
ããããå®éã«è¿ã£ãŠããå€ã¯åãIntã®ãªã¹ãã®ãªã¹ãã[[Int]]ã«ãªã£ãŠããŸã£ãŠããŸãã
ããŸæ¬²ãã<æçµçãªå®è¡çµæ>ã®åã¯ãIntã®ãªã¹ããã€ãŸã[Int]ãªã®ã§ãããã§ã¯æ±ããŠãããã®ã«ãªããŸããã
ããã§ãããªã¹ãã®ãªã¹ããã®ãããªå
¥ãåãäžæ®µè§£ãããã®é¢æ°ãconcatã䜿ããŸãã
> concat (plusEach [1, 11] [1, 11]) [2,12,12,22]
ããã§æ¬²ããåã®å€ã«ãªããŸããïŒ
ããã«Haskellã«ã¯ãmap颿°ãè¿ããçµæãconcatãããšããçšéã«ç¹åããconcatMap颿°ãšãããã®ããããŸãã
plusEach颿°ãããã®ãããªåœ¢ã«ãªã£ãŠããã®ã§ãconcatMapã䜿ã£ãŠæ¬¡ã®ããã«æžãæããŠãããŸãããã
plusEach :: [Int] -> [Int] -> [Int] plusEach list1 list2 = concatMap (\element1 -> -- 1ã€ç®ã®ãªã¹ãã®åèŠçŽ ãã map (\element2 -> -- 2ã€ç®ã®ãªã¹ãã®åèŠçŽ ãšã element1 + element2 -- è¶³ãåããã ) list2 ) list1
æ¹ããŠåäœç¢ºèªããŠã¿ãŸãããã
> plusEach [1, 11] [1, 11] [2,12,12,22]
ããããªã§ããïŒ
åã«åãfoldlã®åæå€ãçšæãã
ãããŸã§ã§ãfoldlã«æž¡ãåŒæ°<颿°>ã<åæå€>ã<ãªã¹ã>ã®ãã¡ã<颿°>ãš<ãªã¹ã>ãæ±ããããšãã§ããŸããã
æ®ã<åæå€>ã§ãããããã¯å®éã«ãããããå€ã詊ããŠã¿ããšãã©ããªå€ãé©åããåãããŸãã
ãããŸã§ã§è§Šãããšããã<åæå€>ã®åã¯[Int]ã§ããã
ãã®[Int]ã¯ãæçµçã«ã¯ãçµã¿åããããšã®åèšãã«ãªãã®ã§ããçµã¿åããããšã®åèšãããªãç¶æ
ãããªãã¡ç©ºã®ãªã¹ãã«ããã®ãããããç¥ããŸããã
ã¡ãã£ãšGHCiã§è©ŠããŠã¿ãŸãããã
> foldl plusEach [] [[1, 11], [1, 11], [3]] []
æ®å¿µãªãããæå³ã«åããŠç©ºã®ãªã¹ããè¿ã£ãŠããŠããŸããŸããã ãªãã§ãããïŒ
ãã®çç±ã¯ãmap颿°ãconcatMap颿°ãã空ã®ãªã¹ããåãåããšãã®ãŸãŸç©ºã®ãªã¹ããè¿ããŠããŸãããšã«ãããŸãã
空ã®ãªã¹ãã«ã¯åŒæ°ãšãªãèŠçŽ ããªãã®ã§ã颿°ã®å®è¡ãããããªãããšããããšã§ãã
ãããåé¿ããããã«ã¯ã<åæå€>ã空ã®ãªã¹ãã«ã¯ãããäœãããå€ã®å
¥ã£ããªã¹ãã«ããå¿
èŠããããŸãã
空ã®ãªã¹ã以å€ã§ãçµã¿åããããšã®åèšãããªããªã¹ãã¯ããã°ã0ããå
¥ã£ãŠããªããªã¹ãã[0]ã§ãã
詊ããŠã¿ãŸãããã
> foldl plusEach [0] [[1, 11], [1, 11], [3]] [5,15,15,25]
ä»åºŠã¯ã¡ãããš0 + 1 + 1 + 3ã0 + 1 + 11 + 3ã0 + 11 + 1 + 3ã0 + 11 + 11 + 3ãšãããã¹ãŠã®çµæãèšç®ã§ããŸããã
以äžããŸãšãããšãfoldlã«æž¡ãåŒæ°ã¯æ¬¡ã®ããã«ãªããŸãã
foldl plusEach [0] possiblePoints
ãã®foldlã§æ±ãããææã®åã«ãŒããåãåŸãå€ã®ãçµã¿åããããšã®åèšãããletã䜿ã£ãŠå€æ°ã«ä»£å
¥ããŠãããŸãããã
æçµçãªææã®åèšç¹æ°ã®åè£ã«ãªããªã¹ããªã®ã§ãscoreCandidatesãšãã倿°åã«ããŸãã
ãããŸã§ãå®è£
ãããšãsumHand颿°ã®å®çŸ©ã¯ãããŸã§åãŸããŸãã
sumHand :: [Card] -> Int sumHand cards = let possiblePoints = map toPoint cards scoreCandidates = foldl plusEach [0] possiblePoints -- ... ããããå®è£ ãã ... in -- ... ããããå®è£ ãã ...
次ã¯ãåè£ã®äžããã²ãŒã ã®ã«ãŒã«ã§ããæå©ã«ãªãå€ãçµã蟌ãããšãèããŸãã
filter颿°ã§ãã¹ãããªãåèšç¹æ°ã®ã¿ãéžã¶
ç¶ããŠå®è£ ããã®ã¯ããçµã¿åããããæ±ããåèšã®ãã¡ããã¹ãããªãïŒåèšã21ãè¶ ããªãïŒãã®ã®ã¿ãéžã¶ãåŠçã§ãã
ãããå®çŸããã«ã¯ãfilter颿°ã䜿ãã®ãã¡ããã©ããã§ãããã
filter颿°ã¯ããªã¹ãã®åèŠçŽ ã«å¯ŸããŠé¢æ°ãå®è¡ããããšã§ããªã¹ãã®åèŠçŽ ããéžæããã颿°ã§ãã
GHCiã®:tã³ãã³ãã§åŒæ°ã®åãèŠãŠã¿ãŸãããã
> :t filter filter :: (a -> Bool) -> [a] -> [a]
filterããmap颿°ãfoldl颿°ãšåæ§ã第1åŒæ°ãšããŠé¢æ°ãåãåããŸãã
å宣èšã®äžã§(a -> Bool)ã®ããã«äžžã«ãã³ã§å²ãŸããŠãã颿°ãããã°ãããã¯é¢æ°åã®å€ãåãåãã®ã ãšè§£éããŠãã ããã
filter颿°ã«æž¡ã颿°ã¯ãaãšããåã®å€ãåãåã£ãŠBoolåã®å€ãã€ãŸãçåœå€ãè¿ããªããã°ãªããŸããã
ãã®aã¯ãäœãããããç¹å®ã®åãããããã§ã¯ãªããå倿°ãšåŒã°ãããã®ã§ãã
æ®éã®åã倧æåã§å§ãŸãååã§è¡šãããã®ã«å¯ŸããŠãå倿°ã¯å¿
ãå°æåã§å§ãŸããŸãã
å倿°ã¯ä»»æã®åã衚ããŠããŸããããåãæåã§è¡šãããå倿°ã¯ãåãåã§ãªããã°ãªããªãããšããã«ãŒã«ãèŠããŠãããŠãã ããã
filter颿°ã®å宣èšã«åºãŠããå倿°ã¯ãã¹ãŠaãªã®ã§ãäœã®åã§ãããããã©ããã¹ãŠåãåã§ãªããã°ãªããŸããã
ãã®ããšãããfilter颿°ãåãåã第äžåŒæ°ã®é¢æ°(a -> Bool)ã¯ããªã¹ãã®åèŠçŽ aãšåãåã§ããããšããããšãåãããŸãã
[Int]ããIntã®ãªã¹ããã衚ããŠããã®ãšåãããã«ã[a]ã¯ããšããåaã®ãªã¹ãããšããæå³ã«ãªãã®ã§ãã
filterã®å
filter颿°ã®åãåãåŒæ°ã®åã¯åãããŸããã
ã§ã¯ãfilter颿°ãåŒæ°ãšããŠåãåã(a -> Bool)ã®é¢æ°ãšã[a]ã®ãªã¹ãã¯ãããããã©ããã£ãå€ã«ãªãã®ã§ããããïŒ
ãŸãã[a]ã®ãªã¹ãã¯ãèŠçŽ ãéžæããããªã¹ãã§ãã
(a -> Bool)ã®é¢æ°ã¯ããfilter颿°ã¯ãªã¹ãã®åèŠçŽ ã«å¯ŸããŠé¢æ°ãå®è¡ããããšã§ããªã¹ãã®åèŠçŽ ããéžæããã颿°ããšè¿°ã¹ããšããããªã¹ãã®åèŠçŽ ããéžæãããã®ã«äœ¿çšããŸãã
å
·äœçã«ã¯ãfilter颿°ã¯(a -> Bool)ã®é¢æ°ãå®è¡ããŠãTrueïŒçïŒãè¿ããèŠçŽ ã®ã¿ãéžæããŸãã
ãããŠãéžæããããïŒ(a -> Bool)ã®é¢æ°ãTrueãè¿ããèŠçŽ ã®ã¿ã®ïŒãªã¹ãããfilter颿°ã®æçµçãªå®è¡çµæã®ãªã¹ããšãªãã®ã§ãã
ãã³ã©ã ãæç¶ãåèšèªã§èããfilter
filterããæç¶ãåèšèªã®ç䌌ã³ãŒãã䜿ã£ãŠè¡šçŸããŠã¿ãŸãããã
(a -> Bool)ã®ãããªé¢æ°ã¯è¿°èªïŒpredicateïŒãšåŒã°ããããšãããã®ã§predicateãšããååã«ãã[a]ã®ãªã¹ãã¯ãã®ãŸãŸlistãšããŸãã
// çµæãæ ŒçŽããããã®æ°ãããªã¹ã
result = [];
for(element in list){ // ãªã¹ãã®åèŠçŽ ã«å¯ŸããŠ
// predicate颿°ãå®è¡ããçµæãã
bool = predicate(element);
if(bool){ // çã§ããå Žåã®ã¿ã
// çµæãæ ŒçŽãããªã¹ãã«è¿œå ããŠãã
result.push(element);
}
}
// æçµçã«predicate(element)ã®çµæãTrueã«ãªãèŠçŽ ã ããã
// æçµçãªå®è¡çµæã«å«ãŸããã
return result;
ãã®ãšãããfilter颿°ããforæãšifæãçµã¿åãããããããããµãããã¿ãŒã³ã®äžè¬åãªã®ã§ãã
filter颿°ãå©çšããŠããçµã¿åããããæ±ããåèšã®ãã¡ããã¹ãããªãïŒåèšã21ãè¶
ããªãïŒãã®ã®ã¿ãéžã¶ãåŠçãå®è£
ããŠã¿ãŸãããã
ãŸããå
¥åãšãªããªã¹ãã§ãããããã¯ãã¡ããåé
ã§foldlã䜿ã£ãŠèšç®ããscoreCandidatesã§ãã
颿°ã«ã€ããŠã¯ãä»åã¯ãã¹ãããªãïŒåèšã21ãè¶
ããªãïŒãã®ãéžã¶ããšãç®çãªã®ã§ãäžèšã®ãããªãåèšã21以äžã§ããã°Trueãè¿ãã颿°ã䜿ããŸãããã
(\n -> n <= 21)
以äžãåããããšãfilter颿°ã«æ¬¡ã®åŒæ°ãæž¡ãããšã«ãªããŸãã
filter (\n -> n <= 21) scoreCandidates
ã¡ãã£ãšè©ŠããŠã¿ãŸãããã
> filter (\n -> n <= 21) [1, 11, 23, 21, 22, 5] [1,11,21,5]
ã¡ãããš21ãè¶ ããªãåèšã ãã®ãªã¹ããè¿ã£ãŠããŸããïŒ
ã»ã¯ã·ã§ã³ã§ã©ã ãåŒãæžããã«æžãŸã
ãã£ãããªã®ã§ãäžèšã®åŒããã£ãšç°¡æœãã€çŽæçã«æžãæ¹æ³ãç¥ã£ãŠãããŸãããã
filter颿°ã«æž¡ããŠããã©ã ãåŒ(\n -> n <= 21)ã«æ³šç®ããŠãã ããã
Haskellã§ã¯ãã»ã¯ã·ã§ã³ãšããæ©èœã䜿ãããšã§ãã©ã ãåŒã䜿ããã«æ¬¡ã®ããã«çãã§ããŸãïŒ
(<= 21)
(\n -> n <= 21)ã®14æåãã7æåãŸã§åæžã§ããŸããã
å§çž®ç50%ã§ãïŒ
ã»ã¯ã·ã§ã³ã¯ã<=ã+ã®ãããªäºé
æŒç®åããã巊蟺ãå³èŸºã©ã¡ããäžæ¹ã®ã¿ãæž¡ãã颿°ãç°¡åã«äœãã®ã«äœ¿ããŸãã
äžè¬åãããš(<æŒç®å> <å³èŸºã®å€>)ãããã¯(<巊蟺ã®å€> <æŒç®å>)ãšãã圢åŒã§äœ¿ããŸãã
ããã«ãããã©ã ãåŒã®åŒæ°åãç¢å°ãªã©ãæžããªããŠããããã«ãªããã§ããã
åã«ã+ã®ãããªæŒç®åãæ®éã®é¢æ°ãšããŠæ±ãæ¹æ³ã玹ä»ããŸããããã»ã¯ã·ã§ã³ã¯ãã®èšæ³ãçºå±ãããããŒãžã§ã³ã ãšæã£ãŠãã ããã
æ§æãææ§ã«ããªãããã«ãããã§ãäžžã«ãã³ãå¿
èŠãšãªããŸãã
ã»ã¯ã·ã§ã³ã®ã»ãã®äŸãæããŸãããã GHCiã«æ¬¡ã®ããã«å ¥åããŠã¿ãŠãã ããã
> (/ 5) 13 -- (/ 5) ã§ãã5ã§å²ã颿°ãã«ãªã 2.6 > (2 *) 109 -- (2 *) ã§ãã2åã«ããŠè¿ã颿°ãã«ãªã 218
å
ã»ã©ã®filter颿°ã®åŒã³åºããããã®ã»ã¯ã·ã§ã³ã䜿ã£ãŠæžãçŽãã°ã次ã®ããã«ãªããŸãã
filter (<= 21) scoreCandidates
ãã€ããããã§ããããã¯ãå€ãå ¥åããŠè©ŠããŠã¿ãŸãããã
> filter (<= 21) [1, 11, 23, 21, 22, 5] [1,11,21,5]
æ¯ãèãã¯å€ããããã¡ãããš21ãè¶ ããªãåèšã®ã¿ãéžã°ããŠããŸããïŒ
ãã®filter颿°ã§æ±ãããçµã¿åããããæ±ããåèšã®ãã¡ããã¹ãããªãïŒåèšã21ãè¶
ããªãïŒãã®ã®ã¿ãã®ãªã¹ããletã䜿ã£ãŠå€æ°ã«ä»£å
¥ãããšãããŸã§å®è£
ãããšãsumHand颿°ã®å®çŸ©ã¯ãããŸã§åãŸããŸãã
sumHand :: [Card] -> Int sumHand cards = let possiblePoints = map toPoint cards scoreCandidates = foldl plusEach [0] possiblePoints noBust = filter (<= 21) scoreCandidates in -- ... ããããå®çŸ©ãã ...
ããã¹ãããªãããã®ã®ãªã¹ããªã®ã§ãæåéãnoBustãšããååã®å€æ°ã«ä¿åããŸããã
å€ãè¿ãifãšå€ãè¿ããªã颿°
æ®ãåŠçã¯ãäžèšã®2ã€ã§ãã
- ãã¹ãããªãåèšã1ã€ã§ããã£ãå Žåããã®äžããæãé«ãå€ã®åèšãéžãã§è¿ã
- ãã¹ãããªãåèšã1ã€ããªãå ŽåïŒã©ã®åèšããã¹ãããŠããŸãïŒãåèšã®äžããé©åœãªãã®ãéžãã§è¿ãïŒããã§ã¯ããªã¹ãã®å é ããéžã¶ãã®ãšããŸãïŒ
ãïœå Žåããšããæ¥æ¬èªããæšå¯ã§ããããã«ãäžèšã®2ã€ã¯æ¡ä»¶åå²ã䜿ããªããã°å®è£
ã§ããŸããã
æ¡ä»¶åå²ãšããã°ifã§ããã
ã»ãã®å€ãã®ããã°ã©ãã³ã°èšèªãšåæ§ãHaskellã§ãæ¡ä»¶åå²ã®æ§æãšããŠifã䜿ããŸã
ïŒãã¿ãŒã³ããããããæå³ã§ã¯æ¡ä»¶åå²ã§ãããããã§ã¯äœ¿çšã§ããŸããïŒã
Haskellã®ifã¯ãifæãšã¯åŒã°ãããifåŒãšåŒã°ããŠããŸãã
Rubyãªã©ã®ifåŒãšåæ§ã«ããåŒãã§ãããããå€ãè¿ããŸãã
å ·äœçã«ã¯ã次ã®ãããªæ§æãšãªã£ãŠããŸãã
if <æ¡ä»¶> then <çã®å Žåã«è¿ãå€> else <åœã®å Žåã«è¿ãå€>
then <çã®å Žåã«è¿ãå€>ãšelse <åœã®å Žåã«è¿ãå€>ãšæžãããŠããããšãããåãããšãããHaskellã®ifã¯å€ãè¿ãã®ã§ãã
else <åœã®å Žåã«è¿ãå€>ãå¿
é ã§ããç¹ããHaskellã®ifåŒãªãã§ã¯ã®ç¹åŸŽã§ãã
ãªããããªå¶çŽãããã®ã§ãããïŒã
ååã®èšäºã§è§Šããããã«ãHaskellã«ããããçŽç²ãªé¢æ°ãã¯ããåŒæ°ãåãåã£ãŠå€ãè¿ãïŒãã ãå
¥åºååŠçãªã©ã¯ã§ããªãïŒé¢æ°ãã§ãã
ifåŒããããããçŽç²ãªé¢æ°ãšçµã¿åãããŠäœ¿ããããæå³çŽç²ãªé¢æ°ãªã®ã§ãã
çŽç²ãªé¢æ°ã¯ãååãšããŠãããããå Žåãæ³å®ããŠå¯Ÿå¿ããå€ãè¿ããªããã°ãªããŸããã
ifåŒãããããã«ãŒã«ã«æºæ ããŠããããã<æ¡ä»¶>ãTrueãè¿ãå ŽåãšFalseãè¿ãå Žåã®äž¡æ¹ãæ³å®ããŠããã®ã§ãã
ãã®ãçŽç²ãªé¢æ°ã¯ãååãšããŠãããããå Žåãæ³å®ããŠå¯Ÿå¿ããå€ãè¿ããªããã°ãªããªãããšããã«ãŒã«ã¯ããã®åŸã®èª¬æã§ãèšåããã®ã§èŠããŠãããŠãã ããã
ifã®æ¡ä»¶
ããŸifåŒã䜿ã£ãŠå Žååããããã®ã¯ãããã¹ãããªãåèšã1ã€ã§ããã£ãå Žåããšããã¹ãããªãåèšã1ã€ããªãå Žåãã§ãã
ãããŸã§ã«äœ¿çšããmap颿°ãfoldl颿°ãfilter颿°ãªã©ã«ãã£ãŠããçµã¿åããããæ±ããåèšã®ãã¡ããã¹ãããªãïŒåèšã21ãè¶
ããªãïŒãã®ãã®ãªã¹ããnoBustãšãã倿°ã«ä»£å
¥ãããŠããŸãã
ãã®noBustãšãããªã¹ãã空ã§ãããããããã¯1ã€ä»¥äžã®èŠçŽ ãæã€ãã«ãã£ãŠãå Žååããããã°ããããã§ãã
ãªã¹ãã空ã§ããã調ã¹ãã«ã¯ãnullãšãã颿°ã䜿ããŸããã
ïŒã¡ãã£ãšå€ãã£ãååã§ããïŒã
null颿°ã¯ã空ã®ãªã¹ããæž¡ããšTrueã空ã§ãªããªã¹ããæž¡ããšFalseãè¿ããŸãã
> null [] True > null [1] False
null颿°ãšifåŒã䜿ã£ãŠããªã¹ãnoBustã空ãã©ããã§å ŽååããããšãããŸã§sumHand颿°ãå®è£
ããŠã¿ãŸãããã
sumHand :: [Card] -> Int sumHand cards = let possiblePoints = map toPoint cards scoreCandidates = foldl plusEach [0] possiblePoints noBust = filter (<= 21) scoreCandidates in if null noBust then <çµã¿åããããæ±ããåèšãããé©åœãªãã®ãåãåºã> else <æãé«ãå€ã®åèšãéžã¶>
sumHandã®å®æãŸã§ããå°ãã§ããïŒ
thenã®åŠç
æ®ãã®åŠçã«ã€ããŠãäžæ°ã«å®è£ ããŠããŸããŸãããã
ãŸãã¯ãthenç¯ã®<çµã¿åããããæ±ããåèšãããé©åœãªãã®ãåãåºã>åŠçã§ããããã§ãçµã¿åããããæ±ããåèšããšããã®ã¯ãfoldl颿°ã䜿ã£ãŠè¶³ãåãããŠäœã£ãscoreCandidatesã®ããšã§ããã
ãããŠããé©åœãªãã®ãåãåºããåŠçã¯ãã²ãšãŸãscoreCandidatesã®å
é ã®èŠçŽ ãšããããšã«ããŸãã
ã©ã®èŠçŽ ãåãåºããŠãããã®ã§ãããHaskellã®ãªã¹ãããèŠçŽ ãåãåºããšãã«æãç°¡åã«åãåºããã®ã¯å
é ã®èŠçŽ ãªã®ã§ãå
é ã®èŠçŽ ãšããŸããã
ãªã¹ãã®å
é ã®èŠçŽ ãåãåºãã«ã¯ãæåéãheadãšãã颿°ã䜿ããŸãã
ã€ãŸãããããscoreCandidatesã«å¯ŸããŠå®è¡ããhead scoreCandidatesãšããåŒã<çµã¿åãããåèšç¹æ°ãããé©åœãªãã®ãåãåºã>åŠçã®å®è£
ãšãªããŸãã
elseã®åŠç
æåŸã®<æãé«ãå€ã®åèšãéžã¶>åŠçã¯ãmaximum颿°ãšããããããŸãæåéããªååã®é¢æ°ã䜿ãã°å®è£
ã§ããŸãã
ããã¹ãããªãåèšã1ã€ã§ããã£ãå Žåããã®äžããæãé«ãå€ã®åèšãéžãã§è¿ãããšããã®ãelseç¯ã§è¡ãã¹ãåŠçãªã®ã§ãfilter颿°ã§äœã£ããnoBustãšãããªã¹ãããã®å¯Ÿè±¡ãšãªããŸãã
ãªã®ã§maximum noBustã<æãé«ãå€ã®åèšãéžã¶>åŠçã«åœãããŸãã
ãã³ã©ã ãå€ãè¿ããªã颿°ã«æ³šæ
以äžããŸãšããåã«ãããã§ç޹ä»ãããhead颿°ãšmaximum颿°ã«å
±éãããéåžžã«éèŠãªæ³šæç¹ãè¿°ã¹ãŠãããŸãããã
ãªããšããã®2ã€ã®é¢æ°ã¯ããå€ãè¿ããªããããšãããã®ã§ãã
å
ã»ã©ifåŒã®èª¬æã§ããçŽç²ãªé¢æ°ã¯ãååãšããŠãããããå Žåãæ³å®ããŠå¯Ÿå¿ããå€ãè¿ããªããã°ãªããŸããããšèšã£ãŠããã®ã«ãããã¯ã©ãããããšã§ãããïŒ
æ®å¿µãªãããHaskellã®äžçã«ã¯ãæšæºã§äœ¿ãã颿°ã®äžã«ãã®ã«ãŒã«ãç Žã£ãŠããŸã£ãŠãããã®ãããã€ããããŸãã
ãã®ãã¡ã®2ã€ãhead颿°ãšmaximum颿°ãªã®ã§ãã
ãããããã©ãããå Žåã«å€ãè¿ããªãã®ããå ãžé²ãåã«æ³åããŠã¿ãŠãã ããã GHCiã§ãããã詊ããŠã¿ãã®ãããã§ãããã
åãããŸãããïŒã
ããã§ã¯çããèšããŸãããã
çãã¯ãhead颿°ãšmaximum颿°ãšãã«ãã空ã®ãªã¹ããåãåã£ãå Žåãã§ãã
> head []
*** Exception: Prelude.head: empty list
> maximum []
*** Exception: Prelude.maximum: empty listExceptionãšæžãããã¡ãã»ãŒãžãåºåãããŸããã
ããã¯ãæåéããHaskellã«ããããäŸå€ãã§ãã
head颿°ãšmaximum颿°ã¯ããããããªã¹ãããäœããã®èŠçŽ ã1ååãåºã颿°ã§ãã
ãããããå
é ã®èŠçŽ ããã³æãé«ãå€ã®èŠçŽ ã§ããã
ãããã空ã®ãªã¹ãã«ã¯èŠçŽ ããªãã®ã§ããããã®é¢æ°ã§ãåãåºãããšãã§ããŸããã
ãããhead颿°ãšmaximum颿°ããå€ãè¿ããªããå Žåã«ãªããŸãã
ãå€ãè¿ããªããå ŽåãHaskellã®é¢æ°ã¯ïŒæåéãïŒäŸå€ãæããŸãã
ãã®ãäŸå€ãã¯ãã»ãã®ããã°ã©ãã³ã°èšèªã«ãããäŸå€ãšæŠã䌌ãŠããŸãã
ããã°ã©ã ã®å®è¡äžã«äœããã®é¢æ°ããäŸå€ãæããããŠããŸã£ãå Žåãcatchãªã©ã®é¢æ°ã§åŠçããªãéããããã°ã©ã ããã®ãŸãŸåŒ·å¶çµäºããŠããŸããŸãã
ããããäºæ
ã¯æ¥µåé¿ããããã®ã§ãããã
SwiftãKotlinãScalaãªã©ãæè¿ã®éçåä»ãã®ããã°ã©ãã³ã°èšèªã§ã¯ãããã°ã©ã ã®åŒ·å¶çµäºã確å®ã«åé¿ããªããã颿°ããå€ãè¿ããªããå ŽåãåŠçããããã®åãæäŸãããŠããŸãã
OptionalãšåŒã°ããåã§ãã
ãã¡ããHaskellã«ãããããOptionalã®ãããªåããããŸã
Haskellã«ããããã®ãããªåã¯ãMaybeåãšãããŸãã
ãããã®åã¯ãçŽååãæã€ãå€ã³ã³ã¹ãã©ã¯ã¿ãŒãç¹å®ã®ãã®ã®å Žåã ãããããã£ãä¿æã§ããããšããæ§è³ªãçãããŠããå€ãè¿ããªããå Žåã®å€ã³ã³ã¹ãã©ã¯ã¿ãŒãšããå€ãè¿ããå Žåã®å€ã³ã³ã¹ãã©ã¯ã¿ãŒãšã§åããããšã«ãããåã®å©çšè
ããå€ãè¿ããªããå Žåãå¿
ãæ³å®ããããã«äœãããŠããŸãã
ãå€ãè¿ããªããå Žåããå©çšè
ãå¿
ãæ³å®ã§ããããã«ããããšã«ãã£ãŠãäŸå€ïŒããªãã¡ããã°ã©ã ã®åŒ·å¶çµäºïŒã確å®ã«åé¿ã§ããã®ã§ãã
ãããã䟿å©ãªéå
·ãããã«ãããããããheadãmaximumã¯æŽå²çãªäºæ
ã«ããããå€ãè¿ããªããå Žåã«äŸå€ãæããŠããŸããŸãã
ã§ãã®ã§ãã絶察ã«ãã®ãªã¹ãã¯ç©ºãããªãããšããããšãåãã£ãŠããå ŽåãäŸãã°ä»åã®ããã«äºåã«null颿°ã§ãªã¹ãã空ãã©ãããã§ãã¯ããŠããå Žåã«ã®ã¿äœ¿ãããã«ããŸãããã
head颿°ãšmaximum颿°ã®æ³šæäºé
ãåãã£ããšããã§ããããããããã䜿ã£ãŠsumHand颿°ã®å®è£
ããã¹ãŠåããŸãããã
次ã®ãããªå®çŸ©ãšãªããŸãã
sumHand :: [Card] -> Int sumHand cards = -- ææã®åã«ãŒãããåãåŸãç¹æ°ãèšç®ãã let possiblePoints = map toPoint cards -- åãåŸãç¹æ°ãã¹ãŠãçµã¿åãããŠãçµã¿åããããšã«åèšãæ±ãã scoreCandidates = foldl plusEach [0] possiblePoints -- çµã¿åãããåèšç¹æ°ã®ãã¡ã -- ãã¹ãããªãïŒåèšç¹æ°ã21ç¹ãè¶ ããªãïŒãã®ã®ã¿ãéžã¶ noBust = filter (<= 21) scoreCandidates in -- ãã¹ãããªãåèšç¹æ°ã1ã€ããªãã調ã¹ãŠã if null noBust -- ãã¹ãããªãåèšç¹æ°ã1ã€ããªãå Žåå Žåã -- çµã¿åãããåèšç¹æ°ãããé©åœãªãã®ãåãåºã then head scoreCandidates -- ãã¹ãããªãåèšç¹æ°ã1ã€ã§ããã£ãå Žåã -- ãã®äžããæãé«ãç¹æ°ã®ãã®ãéžãã§è¿ã else maximum noBust
ãã¹ãŠã®å 容ãäžå¯§ã«è§£èª¬ããã®ã§ã説æã¯ããªãé·ããªããŸããããåºæ¥äžãã£ã颿°ã¯ãããªã«çãããããæå³ãæç¢ºã«åããã³ãŒããšããŠæžããŸããïŒ
ãŸãšããšæ¬¡åäºå
ä»åã®èšäºã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®äžéšãæžããªããHaskellã®åºæ¬çãªæ©èœãããªã詳ãã説æããŸããã
åé¡ã衚çŸããåãèªåã§å®çŸ©ãããã®åãå©çšãã颿°ãmapãfoldlãªã©ã®é«é颿°ã䜿ã£ãŠå®çŸ©ããŠããã®ã¯ãå®éã«Haskellããã°ã©ããŒãã¢ããªã±ãŒã·ã§ã³ãæžããšãã®å
žåçãªã¢ãããŒãã§ãã
次åã¯ãåã®å¿çšç·šããšããŠãsumHand颿°ãåå®çŸ©ããŠãªãã¡ã¯ã¿ãªã³ã°ããããã«å®å
šãªãã®ã«ããŠãããŸãã
å ããŠãããæ·±ãHaskellããã°ã©ãã³ã°ãåŠã¶ããã®ã¬ã€ããšãªãæ
å ±ããäŒãããäºå®ã§ãïŒ
çºå±ç·šïŒ Haskellã§ãåãã®ããã³ã·ã£ã«ãæå€§éã«åŒãåºãã«ã¯ïŒã第äºèšèªãšããŠã®Haskellã
å·çè ãããã£ãŒã«
å±±æ¬æ æ»ïŒããŸããšã»ãããïŒ
ç·šéååïŒé¹¿éæ¡äžéïŒããã®ã»ãããã¡ããã




