ããã¯ãã·ãªãŒãºãããã°ã©ããŒã®ããã®ã«ããŽãªãŒçè«ãã®3çªç®ã®èšäºã§ããåãšé¢æ°ã®ã«ããŽãªã¯ããã°ã©ãã³ã°ã§éèŠãªåœ¹å²ãæãããŸãããã®ãããåãšã¯äœãããªãããããå¿
èŠãªã®ãã«ã€ããŠè©±ããŸãããã
誰ãåãå¿
èŠãšããŸããïŒ
éçåä»ããšåçåã匷ãåä»ããšåŒ±ãåä»ãã®å©ç¹ã«ã€ããŠã¯ãã³ãã¥ããã£ã§æèŠã®çžéããããŸãã æèå®éšã§ã¿ã€ãã³ã°ã®éžæè¢ã説æããŸãããã ããã°ã©ã ãäœæãã³ã³ãã€ã«ãå®è¡ããã©ã³ãã ããŒã楜ããæŒãããŒããŒããåããäœçŸäžå¹ãã®ç¿ãæ³åããŠãã ããã
æ©æ¢°èªã§ã¯ããµã«ã«ãã£ãŠçæããããã€ãã®ä»»æã®çµã¿åãããåãå
¥ããããèµ·åãããŸãã ããããé«æ°Žæºèšèªã§ã¯ãã³ã³ãã€ã©ãŒãåå¥ããã³ææ³ã®ãšã©ãŒãæ€åºã§ããããšãé«ãè©äŸ¡ããŠããŸãã å€ãã®ããã°ã©ã ã¯åã«æåŠããããµã«ã¯ããããªãã§æŸçœ®ãããŸãããæ®ãã¯ææ矩ã§ããå¯èœæ§ãé«ããªããŸãã åãã§ãã¯ã¯ãç¡æå³ãªããã°ã©ã ã«å¯Ÿããå¥ã®éå£ãæäŸããŸãã ããã«ãåçã«åä»ããããèšèªã§ã¯åã®äžäžèŽã¯å®è¡æã«ã®ã¿æ€åºãããŸãããå³å¯ã«åæå®ãããéçã«ãã§ãã¯ãããèšèªã§ã¯åã®äžäžèŽãã³ã³ãã€ã«æã«æ€åºããããããå€ãã®äžæ£ãªããã°ã©ã ãèµ·åãããåã«æé€ãããŸãã
ã§ããããåé¡ã¯ããµã«ã幞ãã«ããããé©åãªããã°ã©ã ãäœæãããã§ãã
ïŒç¿»èš³è
ã®ã¡ã¢ïŒæ°ãæªãããªãã§ãã ãããäœè
ã¯åçŽã«RNGããã©ã³ãã ãã€ãã·ãŒã±ã³ã¹ããããéå±ãªã¡ã¿ãã¡ãŒã奜ãã§ã¯ãªããããã°ã©ããŒã¢ã³ããŒãåŒã³åºããŸããïŒãéåžžããµã«ãå°å·ããæèå®éšã®ç®æšã¯ãã·ã§ãŒã¯ã¹ãã¢ã®å®å
šãªäœåãäœæããããš
ã§ãïŒçŽïŒç¿»èš³è
ïŒãŸãã¯ãã«ã¹ãã€ã®æŠäºãšå¹³åïŒ ã ã«ãŒãå
ã§ã¹ãã«ãšææ³ããã§ãã¯ãããšãæåã®å¯èœæ§ãåçã«é«ãŸããŸãã åãã§ãã¯ã®é¡äŒŒæ§ã¯ããã«é²ãã§ããŸãïŒRomeoã人ãšããŠå®£èšãããåŸãåãã§ãã¯ã¯èããã®äžã§æé·ããªãããšãšã匷åãªéåå Žã§å
åããã£ããããªãããšã確èªããŸãã
æ§æå¯èœæ§ã«å¿
èŠãªã¿ã€ã
ã«ããŽãªãŒçè«ã¯ãç¢å°ã®æ§æãç 究ããŸãã 2ã€ã®ç¢å°ãé
眮ããããšã¯ã§ããŸããã1ã€ã®ç¢å°ã®ã¿ãŒã²ããã¯ã次ã®ç¢å°ã®å
ã®ãªããžã§ã¯ããšäžèŽããå¿
èŠããããŸãã ããã°ã©ãã³ã°ã§ã¯ãããé¢æ°ããå¥ã®é¢æ°ã«çµæãæž¡ããŸãã 2çªç®ã®é¢æ°ãæåã®é¢æ°ã§ååŸããããŒã¿ãæ£ãã解éã§ããªãå Žåãããã°ã©ã ã¯æ©èœããŸããã äž¡æ¹ã®æ©èœãçµã¿åãããŠæ§æãæ©èœãããå¿
èŠããããŸãã èšèªã®åã·ã¹ãã ã匷åã§ããã»ã©ããã®ã¢ãããŒããããé©åã«èšè¿°ããèªåçã«æ€èšŒã§ããŸãã
å³å¯ãªéçåä»ãã«å¯ŸããŠç§ãèãå¯äžã®æ·±å»ãªè°è«ã¯ãæå³çã«æ£ããããã°ã©ã ãæåŠã§ãããšããããšã§ãã å®éã«ã¯ãããã¯ãã£ãã«èµ·ãããŸãã
ïŒç¿»èš³è
ã®ã¡ã¢ïŒã¹ã©ãã¯ã¹ãé¿ããããã«ãèè
ã¯ããã§èæ
®ããªãã£ãããå€ãã®ã¹ã¿ã€ã«ãããããšã«åæããªãããšã«æ³šæããŠãã ããã -å³å¯ãªåã·ã¹ãã ã§ã¯ããã³ãã¬ãŒããç¹æ§ãåã¯ã©ã¹ãã€ã³ã¿ãŒãã§ãŒã¹ãéããŠã¿ã€ãã³ã°ãå¯èœã§ãããå€ãã®æè¡ããããããèè
ã®æèŠã¯å³å¯ã«ééã£ãŠãããšã¯èŠãªãããŸãããïŒæ¬åœã«å¿
èŠãªãšãã«ã¿ã€ãããŸãã Haskellã§ããunsafeCoerceãæã£ãŠããŸãã ãããããã®ãããªãã¶ã€ã³ã¯è³¢æã«äœ¿çšããå¿
èŠããããŸãã ãã©ã³ãã»ã«ãã«ã®ãã£ã©ã¯ã¿ãŒã§ããã°ã¬ãŽãŒã«ã»ã¶ã ã¶ã¯ã圌ã巚倧ãªã«ããã ã·ã«ãªã£ããšãã«åã·ã¹ãã ã«éåããç§ãã¡ã¯çãããã©ã®ããã«çµãã£ãããç¥ã£ãŠããŸã
ïŒç¿»èš³è
ã®ã¡ã¢ïŒæªã:) ã
ç§ãããè³ã«ããå¥ã®è°è«ã¯ã匷ãåä»ããããã°ã©ããŒã«é床ã®è² æ
ãããããšããããšã§ãã ç§èªèº«ã¯C ++ã§ã€ãã¬ãŒã¿ã®å®£èšãããã€ãæžããã®ã§ããã®åé¡ã«å
±æããããšãã§ããŸãããã³ã³ãã€ã©ã䜿çšãããã³ã³ããã¹ãããã»ãšãã©ã®åãå°åºã§ããåæšè«ãšãããã¯ãããžãããããŸããã C ++ã§ã¯ãèªåå€æ°ã宣èšã§ããã³ã³ãã€ã©ãŒãåãæšæž¬ããŸãã
Haskellã§ã¯ããŸããªå Žåãé€ããå泚éã¯ãªãã·ã§ã³ã§ãã åã¯ã³ãŒãã®ã»ãã³ãã£ã¯ã¹ã«ã€ããŠå€ãã®ããšãäŒããããšãã§ããå宣èšã¯ã³ã³ãã€ã«ãšã©ãŒãç解ããã®ã«åœ¹ç«ã€ã®ã§ãååãšããŠããã°ã©ãã¯ãããã䜿çšããŸãã Haskellã§ã®äžè¬çãªãã©ã¯ãã£ã¹ã¯ãåéçºã§ãããžã§ã¯ããéå§ããããšã§ãã åŸã§ãå泚éã¯å®è£
ã®åºç€ãšãªããã³ã³ãã€ã©ãä¿èšŒããã³ã¡ã³ãã«ãªããŸãã
匷åãªéçåæå®ã¯ãã³ãŒãããã¹ãããªãããšã®èšãèš³ãšããŠãã䜿çšãããŸãã Haskellããã°ã©ããŒããã³ãŒããæ§ç¯ãããå Žåãããã¯æ£ããããšèšãã®ãèãããšãã§ããŸãããã¡ãããåã®ç¹ã§æ£ããããã°ã©ã ãæ£ããçµæãšããæå³ã§æ£ãããšããä¿èšŒã¯ãããŸããã ãã®æ
床ã®çµæãšããŠãå€ãã®ç 究ã§ãHaskellã¯ã³ãŒãå質ã®ç¹ã§ä»ã®èšèªãããã¯ããã«å
ãããŠããŸããã§ããã åæ¥æ¡ä»¶ã§ã¯ããã°ãä¿®æ£ããå¿
èŠæ§ã¯ç¹å®ã®ã¬ãã«ã®å質ãŸã§ããååšããªãããã§ããããã¯äž»ã«ãœãããŠã§ã¢éçºãšãšã³ããŠãŒã¶ãŒã®èš±å®¹åºŠã®çµæžåŠã«é¢é£ããŠãããããã°ã©ãã³ã°èšèªãéçºæ¹æ³è«ãšã¯éåžžã«åŒ±ãã€ãªããããããŸãã æè¯ã®åºæºã¯ãã¹ã±ãžã¥ãŒã«ããé
ããŠãããããžã§ã¯ãã®æ°ã枬å®ããããæ©èœã倧å¹
ã«åæžãããŠããããšã§ãã
ããŠããŠããããã¹ãã¯å³å¯ãªã¿ã€ãã³ã°ã«åã£ãŠä»£ããããšãã§ãããšãã䞻匵ã«é¢ããŠã 匷ãåä»ããããèšèªã§ã®ãªãã¡ã¯ã¿ãªã³ã°ã®äžè¬çãªå®è·µãã€ãŸãé¢æ°ã®åŒæ°ã®åãå€æŽããããšãæ€èšããŠãã ããã 匷ãåä»ããããèšèªã§ã¯ããã®é¢æ°ã®å®£èšãå€æŽãããã¹ãŠã®ã¢ã»ã³ããªãšã©ãŒãä¿®æ£ããã ãã§ååã§ãã 匱ãåä»ãã®èšèªã§ã¯ãé¢æ°ãçŸåšä»ã®ããŒã¿ãäºæããŠãããšããäºå®ãåŒã³åºãå
ã«é¢é£ä»ããããšã¯ã§ããŸããã
ãŠããããã¹ãã¯ççŸã®äžéšãèŠã€ããããšãã§ããŸããããã¹ãã¯ã»ãšãã©ã®å Žåã決å®è«çãªããã»ã¹ã§ã¯ãªã確çè«çãªããã»ã¹ã§ãã
ã¿ã€ããšã¯äœã§ããïŒ
åã®æãç°¡åãªèª¬æïŒå€ã®ã»ããã§ãã BoolåïŒç¹å®ã®åã¯Haskellã®å€§æåã§å§ãŸãããšãæãåºããŠãã ããïŒã¯ãTrueãšFalseã®2ã€ã®èŠçŽ ã®ã»ããã«å¯Ÿå¿ããŸãã æåã¿ã€ãã¯ããã¹ãŠã®Unicodeæåã®ã»ããã§ãïŒããšãã°ããaããŸãã¯ãÄ
ãïŒã
ã»ããã¯æéãŸãã¯ç¡éã§ãã æåååã¯ãæ¬è³ªçã«Charãªã¹ãã®å矩èªã§ãããç¡éã»ããã®äŸã§ãã
xãæŽæ°ãšããŠå®£èšããå ŽåïŒ
x :: Integer
æŽæ°ã»ããã®èŠçŽ ã§ãããšèšããŸãã Haskellã®æŽæ°ã¯ç¡ééåã§ãããä»»æã®ç²ŸåºŠã®ç®è¡æŒç®ã«äœ¿çšã§ããŸãã C ++ã®intã®ãããªãã·ã³ã¿ã€ãã«å¯Ÿå¿ããæéã»ããIntããããŸãã
ã¿ã€ããã»ããã«çããããããšãå°é£ã«ãã埮åŠãªç¹ãããã€ããããŸãã åšæçãªå®çŸ©ãæã€ããªã¢ãŒãã£ãã¯é¢æ°ã«ã¯åé¡ãããããã¹ãŠã®ã»ããã®ã»ãããæã€ããšãã§ããªããšããäºå®ã«ãåé¡ããããŸãã ããããç§ãçŽæããããã«ãç§ã¯å³å¯ãªæ°åŠè
ã§ã¯ãããŸããã éèŠãªããšã¯ãã»ãããšåŒã°ããã»ããã®ã«ããŽãªããããããã䜿çšããŠäœæ¥ããããšã§ãã
ã»ããã§ã¯ããªããžã§ã¯ãã¯ã»ããã§ãããå°ïŒç¢å°ïŒã¯é¢æ°ã§ãã
Setã¯ç¹å¥ãªã«ããŽãªã§ãããªããªãããã®ãªããžã§ã¯ãã®å
éšãèŠãããšãã§ããããã¯å€ãã®çŽæçãªç解ã«åœ¹ç«ã€ããã§ãã ããšãã°ã空ã®ã»ããã«ã¯èŠçŽ ããªãããšãããã£ãŠããŸãã 1ã€ã®èŠçŽ ã®ç¹å¥ãªã»ãããããããšãç¥ã£ãŠããŸãã é¢æ°ã¯ãããã»ããã®èŠçŽ ãå¥ã®ã»ããã®èŠçŽ ã«ãããã³ã°ããããšãç¥ã£ãŠããŸãã 2ã€ã®èŠçŽ ã1ã€ã«è¡šç€ºã§ããŸããã2ã€ã«1ã€ã®èŠçŽ ã¯è¡šç€ºã§ããŸããã æçé¢æ°ã¯ãã»ããã®åèŠçŽ ãããèªäœã«ãããã³ã°ããããšãç¥ã£ãŠããŸãã ãã®æ
å ±ããã¹ãŠå¿ããŠã代ããã«ããããã¹ãŠã®æŠå¿µãçŽç²ã«ã«ããŽãªãŒçãªåœ¢åŒã§ãã€ãŸããªããžã§ã¯ããšç¢å°ã®èŠ³ç¹ããè¡šçŸããã€ããã§ãã
çæ³çãªäžçã§ã¯ãHaskellã®åã¯ã»ããã§ãããHaskellã®é¢æ°ã¯ãããã®éã®æ°åŠé¢æ°ã§ãããšç°¡åã«èšãããšãã§ããŸãã å°ããªåé¡ã1ã€ã ããããŸããæ°åŠé¢æ°ã¯ã³ãŒããå®è¡ãããçããç¥ã£ãŠããã ãã§ãã Haskellã®é¢æ°ãçããèšç®ããå¿
èŠããããŸãã çããæéã®ã¹ãããæ°ã§åŸãããå Žåãããã¯åé¡ã§ã¯ãããŸããããã©ããªã«å€§ãããŠãããŸããŸããã ããããååž°ãå«ãããã€ãã®èšç®ãããããããã¯æ±ºããŠå®äºããªãå¯èœæ§ããããŸãã Haskellã§ã¯å®äºããªãé¢æ°ãåçŽã«çŠæ¢ããããšã¯ã§ããŸãããé¢æ°ãå®äºãããã©ãããåºå¥ããããš-æåãªåæ¢åé¡-ã¯è§£æ±ºã§ããªãããã§ãã ã ãããããã³ã³ãã¥ãŒã¿ãŒç§åŠè
ã¯ããªãã®èŠç¹ã«å¿ããŠãããã ãšåŒã°ããç¹å¥ãªæå³ãæã€åã¿ã€ããæ¡åŒµããããã«çŽ æŽãããã¢ã€ãã¢ããŸãã¯æ±ãããã¯ãæãã€ããŸãã
ïŒç¿»èš³è
ã®ã¡ã¢ïŒãã®çšèªïŒäžïŒã¯ãã·ã¢èªã§ã¯ãªããšãªãæãã§ãïŒè¯ããªãã·ã§ã³ãç¥ã£ãŠãã人ã¯ãææ¡ããŠãã ãããïŒ ãããã¯_ | _ãŸãã¯Unicode inã§ç€ºãããŸãã ãã®ãå€ãã¯ãäžå®å
šãªèšç®ã«å¯Ÿå¿ããŸãã ãããã£ãŠãé¢æ°ã¯æ¬¡ã®ããã«å®£èšãããŸãã
f :: Bool -> Bool
TrueãFalseããŸãã¯_ | _ãè¿ãããšãã§ããŸãã åŸè
ã¯ãé¢æ°ãçµäºããªãããšãæå³ããŸãã
èå³æ·±ãããšã«ãåã·ã¹ãã ã§bottomãåãå
¥ãããšããã«ããã¹ãŠã®ã©ã³ã¿ã€ã ãšã©ãŒãbottomãšã¿ãªããé¢æ°ãæ瀺çã«bottomãè¿ãããã«ãããšäŸ¿å©ã§ãã åŸè
ã¯éåžžãæªå®çŸ©ã®åŒã䜿çšããŠè¡ãããŸãã
f :: Bool -> Bool fx = undefined
æªå®çŸ©ã¯äžéšã§è©äŸ¡ãããBoolãå«ããã¹ãŠã®ã¿ã€ãã«å«ãŸããããããã®å®çŸ©ã¯ã¿ã€ããã§ãã¯ã«åæ ŒããŸãã ããªããæžãããšãã§ããŸãïŒ
f :: Bool -> Bool f = undefined
ïŒxãªãïŒbottomã¯Bool-> Boolåã®ã¡ã³ããŒã§ãããããã
ãã¹ãŠã®å¯èœãªåŒæ°ã«å¯ŸããŠæ£ããçµæãè¿ãéåžžã®é¢æ°ãšã¯ç°ãªããããã ãè¿ãããšãã§ããé¢æ°ã¯ããŒã·ã£ã«ãšåŒã°ããŸãã
äžéšã®ãããHaskellã®ã¿ã€ããšé¢æ°ã®ã«ããŽãªã¯Setã§ã¯ãªãHaskãšåŒã°ããŸãã çè«çãªèŠ³ç¹ãããããã¯ç¡éã®è€éãã®åå ã§ããããããã®æ®µéã§èå±ã®ãã€ãã䜿çšããŠãã®è°è«ãå®äºããŸãã å®çšçãªèŠ³ç¹ããã¯ãäžå®å
šãªé¢æ°ãšããã ãç¡èŠããŠãHaskããã«ã»ãããšããŠäœ¿çšã§ããŸãã
ãªãæ°åŠã¢ãã«ãå¿
èŠãªã®ã§ããïŒ
ããã°ã©ããšããŠãããªãã¯ããã°ã©ãã³ã°èšèªã®æ§æãšææ³ã«ç²ŸéããŠããŸãã èšèªã®ãããã®åŽé¢ã¯ãéåžžãèšèªä»æ§ã®æåã«æ£åŒã«èšè¿°ãããŠããŸãã ããããèšèªã®æå³ãšã»ãã³ãã£ã¯ã¹ãèšè¿°ããã®ã¯ã¯ããã«å°é£ã§ãã ãã®èª¬æã¯ããå€ãã®ããŒãžãå ããŸããããã£ãã«æ£åŒãªãã®ã§ã¯ãªããã»ãšãã©å®å
šã«ã¯ãããŸããã ãããã£ãŠãèšèªåŒè·å£«éã®çµããã®ãªãè°è«ãããã³èšèªæšæºã®è€éãã®è§£éã«å°å¿µããæžç±ã®è·äººæ¥çå
šäœã
èšèªã®ã»ãã³ãã£ã¯ã¹ãèšè¿°ããããã®æ£åŒãªããŒã«ããããŸããããã®è€éãã®ããããããã¯äž»ã«å·¥æ¥çšããã°ã©ãã³ã°ã®å·šäººã§ã¯ãªããåçŽåãããã¢ã«ãããã¯èšèªã«äœ¿çšãããŸãã ãããã®ããŒã«ã®1ã€ã¯æäœäžã®ã»ãã³ãã£ã¯ã¹ãšåŒã°ããããã°ã©ã å®è¡ã®ã¡ã«ããºã ãèšè¿°ããŸãã ããã¯ã圢åŒåãããçæ³åãããã€ã³ã¿ãŒããªã¿ãŒãå®çŸ©ããŸãã C ++ãªã©ã®ç£æ¥çšèšèªã®ã»ãã³ãã£ã¯ã¹ã¯ãéåžžãéå
¬åŒã®æšè«ã䜿çšããŠãéåžžãæœè±¡ãã·ã³ãã®èŠ³ç¹ãã説æãããŸãã
åé¡ã¯ãæäœäžã®ã»ãã³ãã£ã¯ã¹ã䜿çšããããã°ã©ã ã«ã€ããŠäœãã蚌æããããšãéåžžã«é£ããããšã§ãã ããã°ã©ã ã®ç¹å®ã®ããããã£ã衚瀺ããã«ã¯ãå®éã«ã¯ãçæ³çãªã€ã³ã¿ãŒããªã¿ãŒãä»ããŠãå®è¡ãããå¿
èŠããããŸãã
ããã°ã©ããŒãæ£åŒã«æ£åœæ§ã蚌æããªãããšã¯åé¡ã§ã¯ãããŸããã ç§ãã¡ã¯åžžã«æ£ããããã°ã©ã ãæžããŠãããšãèããŠããŸããã ããŒããŒãã®åã«èª°ãããŸãããããããã³ãŒããæ°è¡æžããŠäœãèµ·ãããèŠãŠã¿ãŸããããã
ïŒç¿»èš³è
ã®ã¡ã¢ïŒãããããªã...ïŒç§ãã¡ãæžãã³ãŒãã¯ç¢ºå®ã«å®è¡ããããšä¿¡ããŠããŸãããã¯ãç§ãã¡ãæžããããã°ã©ã ãæ¬åœã«èããŠããããšãæå³ããŠãããéåžžã¯é ã®äžã§ã€ã³ã¿ãŒããªã¿ãŒãå®è¡ããããšã§ãããè¡ããŸãã ããã¹ãŠã®å€æ°ã远跡ããããšã¯éåžžã«å°é£ã§ããã³ã³ãã¥ãŒã¿ã¯ããã°ã©ã ãå®è¡ããã®ã«é©ããŠããŸãã - ç§ãã¡ãããå Žåããããç§ãã¡ã¯ã³ã³ãã¥ãŒã¿ãå¿
èŠã¯ãããŸããïŒ
ãããã代æ¿æ段ããããŸãã ããã¯è¡šç€ºçæå³è«ãšåŒã°ããæ°åŠã«åºã¥ããŠããŸãã 衚瀺çæå³è«ã§ã¯ãåèšèªæ§æäœã«å¯ŸããŠæ°åŠç解éãèšè¿°ãããŸãã ãããã£ãŠãããã°ã©ã ã®æ§è³ªã蚌æãããå Žåã¯ãåã«æ°åŠçå®çã蚌æããã ãã§ãã å®çã蚌æããããšã¯é£ãããšæããŸãããå®éãç§ãã¡äººéã¯æ°å幎ã«ããã£ãŠæ°åŠçææ³ãæ§ç¯ããŠããããã䜿çšã§ããèç©ãããç¥èããããããããŸãã ããã«ãããã®æ°åŠè
ã«ãã£ãŠèšŒæãããå®çãšæ¯èŒããŠãç§ãã¡ãããã°ã©ãã³ã°ã§ééããåé¡ã¯ãäºçŽ°ã§ã¯ãªãã«ããŠããéåžžéåžžã«ç°¡åã§ãã
ïŒç¿»èš³è
泚ïŒèšŒæ ãšããŠãèè
ã¯ããã°ã©ããŒãæãããããšã¯ããŠããŸãããïŒHaskellã®éä¹é¢æ°ã®å®çŸ©ãèããŠã¿ãŸããããHaskellã¯ã衚瀺çãªæå³è«ã«åœ¹ç«ã€èšèªã§ãã
fact n = product [1..n]
åŒ[1..n]ã¯ã1ãnã®æŽæ°ã®ãªã¹ãã§ãã 補åé¢æ°ã¯ããã¹ãŠã®ãªã¹ãã¢ã€ãã ãä¹ç®ããŸãã æç§æžããåãããéä¹ã®å®çŸ©ã®ããã«ã ãããCãšæ¯èŒããŠãã ããïŒ
int fact(int n) { int i; int result = 1; for (i = 2; i <= n; ++i) result *= i; return result; }
ç¶è¡ããå¿
èŠããããŸããïŒ
ïŒç¿»èš³è
ã®ã¡ã¢ïŒèè
ã¯Haskellã®ã©ã€ãã©ãªé¢æ°ã䜿çšããããšã§å°ãããŸãããŸãããå®éãããªãã¯ããå¿
èŠã¯ãããŸããã§ãããå®çŸ©ã«ããæ£çŽãªèª¬æã¯ããã»ã©é£ãããããŸããïŒ ïŒ
fact 0 = 1 fact n = n * fact (n - 1)
ãŸããç§ã¯ããã«ãããå®ãæè¿ã ã£ãããšãèªããŸãïŒ éä¹ã«ã¯æ確ãªæ°åŠçå®çŸ©ããããŸãã è³¢æãªèªè
ã¯å°ãããããããŸããïŒããŒããŒãããæåãèªã¿åãããã®ããŸãã¯ãããã¯ãŒã¯ãä»ããŠãã±ãããéä¿¡ããããã®æ°åŠã¢ãã«ã¯äœã§ããïŒ é·ãéãããã¯ããããã説æã«ã€ãªããåä»ãªè³ªåã§ããã 衚瀺çæå³è«ã¯ãæçšãªããã°ã©ã ãæžãããã«å¿
èŠã§ãããæäœçæå³è«ã«ãã£ãŠå®¹æã«è§£æ±ºã§ããéèŠãªã¿ã¹ã¯ã®ããªãã®æ°ã«é©ããªãããã«æãããŸããã ãã¬ãŒã¯ã¹ã«ãŒã¯ã«ããŽãªãŒçè«ããçãŸããŸããã Eugenio Mojiã¯ãèšç®å¹æãã¢ããã«å€æã§ããããšãçºèŠããŸããã ããã¯éèŠãªèŠ³å¯ã§ããããšãå€æããŸãããããã¯ã衚瀺ã®ã»ãã³ãã£ã¯ã¹ã«æ°ããåœãå¹ã蟌ã¿ãçŽç²ã«æ©èœçãªããã°ã©ã ããã䟿å©ã«ããã ãã§ãªããåŸæ¥ã®ããã°ã©ãã³ã°ã«é¢ããæ°ããæ
å ±ãæäŸããŸããã ã¢ããã«ã€ããŠã¯ãããã«ããŽãªçãªããŒã«ãéçºãããšãã«èª¬æããŸãã
ããã°ã©ãã³ã°çšã®æ°åŠã¢ãã«ãæã€ããšã®éèŠãªå©ç¹ã®1ã€ã¯ããœãããŠã§ã¢ã®æ£ç¢ºæ§ã®æ£åŒãªèšŒæãå®è¡ã§ããããšã§ãã æ¶è²»è
åããœãããŠã§ã¢ãäœæããå Žåãããã»ã©éèŠã§ã¯ãªãããã«æãããããããŸããããããã°ã©ãã³ã°ã®åéã§ã¯ãé害ã®ã³ã¹ããè«å€§ã«ãªãå¯èœæ§ããããã人åœãå±éºã«ãããããŸãã ãããããã«ã¹ã±ã¢ã·ã¹ãã çšã®Webã¢ããªã±ãŒã·ã§ã³ãäœæããå Žåã§ããHaskellæšæºã©ã€ãã©ãªã®é¢æ°ãšã¢ã«ãŽãªãºã ã«ã¯æ£ç¢ºæ§ã®èšŒæãä»ããŠãããšããèããç解ã§ããŸãã
ãããã§æ±ããæ©èœ
C ++ãŸãã¯ä»ã®åœä»€åèšèªã§é¢æ°ãšåŒã¶ãã®ã¯ãæ°åŠè
ãé¢æ°ãåŒã³åºãããšãšåãã§ã¯ãããŸããã æ°åŠé¢æ°ãšã¯ãåã«å€ãå€ã«ãããã³ã°ããããšã§ãã
ããã°ã©ãã³ã°èšèªã§æ°åŠé¢æ°ãå®è£
ã§ããŸãããã®ãããªé¢æ°ã¯ãå
¥åå€ãæã¡ãåºåå€ãèšç®ããŸãã äºä¹æ°ãååŸããé¢æ°ã¯ãå
¥åå€ãããèªäœã§ä¹ç®ããå¯èœæ§ããããŸãã 圌女ã¯ãã¹ãŠã®åŒã³åºãã§ãããè¡ããåãåŒæ°ã§åŒã³åºããããã³ã«åãçµæãçæããããšãä¿èšŒãããŠããŸãã æ°åã®äºä¹ã¯ãæã®æºã¡æ¬ ãã«ãã£ãŠå€åããŸããã
ããã«ãæ°ã®äºä¹ãèšç®ããŠããç¬ã«ãããããã·ã¥ãã£ãã§ã¯ãäžãããªã©ã®å¯äœçšããã£ãŠã¯ãªããŸããã ãããè¡ããé¢æ°ãã¯ãæ°åŠé¢æ°ã§ã¯ç°¡åã«ã¢ãã«åã§ããŸããã
ããã°ã©ãã³ã°èšèªã§ã¯ãåãåŒæ°ã«å¯ŸããŠåžžã«åãçµæãäžããå¯äœçšã®ãªãé¢æ°ã¯çŽç²ãšåŒã°ããŸãã Haskellã®ãããªçŽç²ãªé¢æ°åèšèªã§ã¯ããã¹ãŠã®é¢æ°ã¯çŽç²ã§ãã ããã«ããããããã®èšèªã®è¡šç€ºçã»ãã³ãã£ã¯ã¹ãå®çŸ©ããã«ããŽãªçè«ã䜿çšããŠã¢ãã«åããããšã容æã«ãªããŸãã ä»ã®èšèªã®å Žåã¯ãåžžã«çŽç²ãªãµãã»ããã«å¶éããããå¯äœçšã«ã€ããŠåå¥ã«èããããšãã§ããŸãã åŸã§ãçŽç²ãªé¢æ°ã®ã¿ã䜿çšããŠãããããçš®é¡ã®å¹æãã¢ããã§ã·ãã¥ã¬ãŒãã§ããããšã確èªããŸãã ãã®çµæãç§ãã¡ã¯äœã倱ãããšãªããèªåèªèº«ãæ°åŠé¢æ°ã«å¶éããŸãã
ã¿ã€ãã®äŸ
ã¿ã€ããã»ããã§ãããšå€æããããéåžžã«ãšããŸããã¯ãªäŸãããã€ãæãã€ãããšãã§ããŸãã ããšãã°ã空ã®ã»ããã«å¯Ÿå¿ããã¿ã€ãã¯äœã§ããïŒ ããããããã¯C ++ã§ã¯ç¡å¹ã§ã¯ãããŸãããããã®ã¿ã€ãã¯Haskellã§ã¯VoidãšåŒã°ããŸãã ããã¯ãå€ãå
¥åãããŠããªãã¿ã€ãã§ãã Voidãåãåãé¢æ°ãå®çŸ©ã§ããŸãããåŒã³åºãããšã¯ã§ããŸããã ãããåŒã³åºãã«ã¯ãVoidåã®å€ãæäŸããå¿
èŠããããŸãããããã¯åã«ååšããŸããã ãã®é¢æ°ãè¿ãããšãã§ãããã®ã«é¢ããŠã¯ãå¶éã¯ãããŸããã ä»»æã®åãè¿ãããšãã§ããŸãïŒãã ããåŒã³åºãããšãã§ããªããããããã¯çºçããŸããïŒã èšãæããã°ãããã¯æ»ãå€ã®åãå€æ
çãªé¢æ°ã§ãã ãã¹ã±ã©ãŒã¯åœŒå¥³ã«é»è©±ããããŸããã
absurd :: Void -> a
ïŒç¿»èš³è
ã®ã¡ã¢ïŒC ++ã§ã¯ããã®ãããªé¢æ°ã¯å®çŸ©ã§ããŸãããC++ã§ã¯ãåã¿ã€ãã«å°ãªããšã1ã€ã®å€ããããŸããïŒïŒaã¯åå€æ°ã§ãããã©ã®åã§ãããŸããŸãããïŒãã®ååã¯å¶ç¶ã§ã¯ãããŸããã ã«ãªãŒ-ãã¯ãŒãååãšåŒã°ããè«çã«é¢ããŠãåãšé¢æ°ã®ããæ·±ã解éããããŸãã Voidåã¯äžçå®ãè¡šããäžæ¡çãªæ©èœã¯ãã©ãã³èªã®ãã¬ãŒãºãex falso sequitur quodlibetãã®ããã«ãäœããèåœããçãããšããã¹ããŒãã¡ã³ããè¡šã
ãŸãã次ã«ãã·ã³ã°ã«ãã³ã»ããã«å¯Ÿå¿ããã¿ã€ãããããŸãã ããã¯ãå¯èœãªå€ã1ã€ã ãæã€ã¿ã€ãã§ãã ãã®æå³ã¯åã«ããããã§ãã ããã«ã¯èªèãããªããããããŸããããC ++ã§ã¯ç¡å¹ã§ãã ãã®ã¿ã€ãã®æ©èœãèããŠã¿ãŠãã ããã voidããã®é¢æ°ã¯ãã€ã§ãåŒã³åºãããšãã§ããŸãã çŽç²ãªé¢æ°ã®å Žåãåžžã«åãçµæãè¿ãããŸãã ãã®ãããªé¢æ°ã®äŸã次ã«ç€ºããŸãã
int f44() { return 44; }
ãã®é¢æ°ã¯ããªãããåãå
¥ãããšèãããããããŸããããå
ã»ã©èŠãããã«ãããªããã®ã¿ã€ããè¡šãå€ããªããããããªãããåãå
¥ããé¢æ°ãåŒã³åºãããšã¯ã§ããŸããã ããã§ããã®é¢æ°ã¯äœãããŸããïŒ æŠå¿µçã«ã¯ãåäžã®ã€ã³ã¹ã¿ã³ã¹ã®ã¿ãæã€ãããŒå€ã䜿çšãããããã³ãŒãã§æ瀺çã«æå®ããããšã¯ã§ããŸããã ãã ããHaskellã«ã¯ããã®å€ã®èšå·ããããŸãã空ã®æ¬åŒ§ã®ãã¢ïŒïŒã§ãã ãããã£ãŠãé¢çœãäžèŽïŒãŸãã¯äžèŽã§ã¯ãªãïŒïŒã®ãããvoidããã®é¢æ°åŒã³åºãã¯C ++ãšHaskellã§åãã«èŠããŸãã ããã«ãHaskellã®ç°¡æœãã倧奜ãã§ãããããåãèšå·ïŒïŒããã·ã³ã°ã«ãã³ã»ããã«å¯Ÿå¿ããåãã³ã³ã¹ãã©ã¯ã¿ãŒãããã³åäžã®å€ã«ã䜿çšãããŸãã Haskellã®é¢æ°ã¯æ¬¡ã®ãšããã§ãã
f44 :: () -> Integer f44 () = 44
æåã®è¡ã¯ãf44ããunitããšããåïŒïŒãIntegeråã«å€æããããšã宣èšããŠããŸãã 2è¡ç®ã¯ãf44ããã¿ãŒã³ãããã³ã°ã䜿çšããŠããŠãããã®åäžã®ã³ã³ã¹ãã©ã¯ã¿ãŒãã€ãŸãïŒïŒãæ°å€44ã«å€æããããšã決å®ããŸãããã®é¢æ°ãåŒã³åºãã«ã¯ãå€ïŒïŒãæå®ããŸãã
f44 ()
1ã€ã®åé¢æ°ã¯ãã¿ãŒã²ããã¿ã€ããã1ã€ã®èŠçŽ ãéžæããããšã«çžåœããããšã«æ³šæããŠãã ããïŒããã§ã¯ãæŽæ°44ãéžæãããŠããŸãïŒã å®éãf44ã¯æ°å€44ã®å¥ã®è¡šçŸãšèããããšãã§ããŸããããã¯ãã»ããã®èŠçŽ ãžã®çŽæ¥åç
§ãé¢æ°ïŒç¢å°ïŒã«çœ®ãæããæ¹æ³ã®äŸã§ãã 1ããç¹å®ã®ã¿ã€ãAãŸã§ã®é¢æ°ã¯ãAã®èŠçŽ ãš1察1ã§å¯Ÿå¿ããŠããŸãã
voidãè¿ãé¢æ°ããŸãã¯Haskellã§ã¯1ãè¿ãé¢æ°ã¯ã©ãã§ããïŒ C ++ã§ã¯ããã®ãããªé¢æ°ã¯å¯äœçšã«äœ¿çšãããŸãããæ°åŠçãªæå³ã§ã¯ããã®ãããªé¢æ°ã¯å®åšããªãããšãããã£ãŠããŸãã 1ã€ãè¿ãçŽç²ãªé¢æ°ã¯äœãè¡ããŸãããåŒæ°ãç Žæ£ããŸãã
æ°åŠçã«ã¯ãã»ããAããã·ã³ã°ã«ãã³ã»ãããžã®é¢æ°ã¯ãåèŠçŽ ããã®ã»ããã®åäžã®èŠçŽ ã«ãããã³ã°ããŸãã Aããšã«ããã®ãããªé¢æ°ã1ã€ã ããããŸãã ããã¯æŽæ°çšã§ãïŒ
fInt :: Integer -> () fInt x = ()
ããªãã¯åœŒå¥³ã«ä»»æã®æŽæ°ãäžãã圌女ã¯1ãè¿ããŸãã ç°¡æœãã®ç²Ÿç¥ã«åŸã£ãŠãHaskellã§ã¯åŒæ°ãšããŠã¢ã³ããŒã¹ã³ã¢ã䜿çšã§ããŸãããããã¯ç Žæ£ãããŸãã ãããã£ãŠãååãæãã€ãå¿
èŠã¯ãããŸããã äžèšã®ã³ãŒãã¯æ¬¡ã®ããã«æžãæããããšãã§ããŸãã
fInt :: Integer -> () fInt _ = ()
ãã®é¢æ°ã®å®è¡ã¯ãæž¡ãããå€ã ãã§ãªããåŒæ°ã®ã¿ã€ãã«ãäŸåããããšã«æ³šæããŠãã ããã
ä»»æã®åã«å¯ŸããŠåãåŒã§å®çŸ©ã§ããé¢æ°ã¯ããã©ã¡ããªãã¯å€çžãšåŒã°ããŸãã ç¹å®ã®ã¿ã€ãã®ä»£ããã«ãã©ã¡ãŒã¿ã䜿çšããŠãåäžã®æ¹çšåŒã§ãã®ãããªé¢æ°ã®ãã¡ããªå
šäœãå®è£
ã§ããŸãã å€æ
æ§é¢æ°ã«ä»»æã®åãã1ã€ã®åã«ååãä»ããæ¹æ³ã¯ïŒ ãã¡ããããŠããããšåŒã³ãŸãã
unit :: a -> () unit _ = ()
C ++ã§ã¯ã次ã®ããã«å®è£
ããŸãã
template<class T> void unit(T) {}
ïŒç¿»èš³è
ã®ã¡ã¢ïŒã³ã³ãã€ã©ãŒãnoopã§æé©åã§ããããã«ããã«ã¯ããã®æ¹æ³ã®æ¹ãè¯ãã§ãïŒïŒ template<class T> void unit(T&&) {}
ããã«ãã¿ã€ãã®é¡åãã«ã¯ã2ã€ã®èŠçŽ ã®ã»ããããããŸãã C ++ã§ã¯boolãšåŒã°ããHaskellã§ã¯é©ãããšã§ã¯ãªããBoolãšåŒã°ããŸãã éãã¯ãC ++ boolã§ã¯çµã¿èŸŒã¿åã§ããã®ã«å¯ŸããŠãHaskellã§ã¯æ¬¡ã®ããã«å®çŸ©ã§ããããšã§ãã
data Bool = True | False
ïŒãã®å®çŸ©ã次ã®ããã«èªãã§ãã ããïŒBoolã¯TrueãŸãã¯Falseã®ããããã§ããïŒååãšããŠãC ++ã§ãã®ã¿ã€ããèšè¿°ã§ããŸãã
enum bool { true, false };
ãã ããC ++åæã¯å®éã«ã¯æŽæ°ã§ãã C ++ 11ãã¯ã©ã¹åæãã䜿çšããããšãã§ããŸãããã¯ã©ã¹åbool :: trueãŸãã¯bool :: falseã䜿çšããŠå€ãæå®ããå¿
èŠããããŸãããã¡ãããããã䜿çšããåãã¡ã€ã«ã«å¯Ÿå¿ããããããŒãå«ããå¿
èŠããããŸãã
Boolã®çŽç²ãªé¢æ°ã¯ãã¿ãŒã²ããã¿ã€ããã2ã€ã®å€ãéžæããŸãã1ã€ã¯Trueã«å¯Ÿå¿ãããã1ã€ã¯Falseã«å¯Ÿå¿ããŸãã
Boolã®é¢æ°ã¯è¿°èªãšåŒã°ããŸãã ããšãã°ãHaskell Data.Charã©ã€ãã©ãªã«ã¯ãIsAlphaãisDigitãªã©ã®å€ãã®è¿°èªãå«ãŸããŠããŸãã C ++ã«ã¯ãç¹ã«isalphaé¢æ°ãšisdigité¢æ°ã宣èšããåæ§ã®<cctype>ã©ã€ãã©ãªããããŸãããããŒã«å€ã§ã¯ãªãintãè¿ããŸãã ãããã®è¿°èªã¯<locale>ã§å®çŸ©ãããctype :: isïŒalphaãcïŒããã³ctype :: isïŒdigitãcïŒãšåŒã°ããŸãã
ããã°ã©ããŒã®ã«ããŽãªãŒçè«ïŒåºæã«ããŽãªïŒæ§æã®æ¬è³ªçš®é¡ãšæ©èœ
倧å°ã®ã«ããŽãªã«ããŽãªãŒClaysley