1. Haskellãšã¯
Haskellã¯ãæ°åŠçãªæŠå¿µã«åºã¥ããçŽç²ãªé¢æ°åèšèªã®1ã€ã§ãããå®å šæ§ãšå ç¢æ§ãéèŠããããã°ã©ãã³ã°èšèªã§ããéåžžã«åŒ·åãªåã·ã¹ãã ãæã¡ãé å¥ãªäžŠè¡åŠçãšé 延èšç®ãå¯èœã«ããç¹æ§ããããŸãã
ãã®èšèªã«ã¯”çã®é¢æ°âããããããã¯å ¥åãåãã§ããã°åžžã«åãçµæãè¿ããããå¯äœçšãäžåèµ·ããããšã¯ãããŸããããã®ç¹æ§ãHaskellãç¬ç¹ã§åŒ·åãªããŒã«ã«ããŸãã
ããã«Haskellã«ã¯è±å¯ãªæšæºã©ã€ãã©ãªãæã£ãŠãããããã°ã©ãã³ã°ã®å¹ ãåºããããšãã§ããŸãã
1.1 Haskellã®æŽå²ãšç¹åŸŽ
Haskellã¯ã1987幎ã«èšç«ããããFunctional Programming Languages and Computer Architecture Conferenceãã«ãããŠãé¢æ°åããã°ã©ãã³ã°èšèªã®æ°ããªæšæºãäœããšããç®çã§éçºãå§ãŸããŸããã
ç¹åŸŽãšããŠã¯äž»ã«ä»¥äžã®4ã€ãæããããšãã§ããŸãã
- é«ãæœè±¡åºŠ
- çŽç²ãªé¢æ°åããã°ã©ãã³ã°
- å ç¢æ§
- 䞊è¡åŠçãšé 延èšç®
ããããã«ã€ããŠè©³ããèŠãŠãããŸãããã
1.2 Haskellã®åºæ¬æ§æ
é¢æ°åèšèªãšããŠã®Haskellã§ã¯ãé¢æ°ã¯ç¬¬äžçŽåžæ°ã§ããããã®åã®éãé¢æ°ãäžå¿çãªåœ¹å²ãæãããŸããå¡ãšããŠæ±ãããä»ã®é¢æ°ã«åŒæ°ãšããŠæž¡ãããšãå¯èœã§ãã
é¢æ°å®çŸ©æã«ã¯å宣èšãè¡ãããããã«ãã£ãŠé¢æ°ã®å ¥åãšæ»ãå€ã®åã確å®ããŸããäžåºŠåã決ãããšãã以éå€æŽããããšã¯ã§ããŸããã
éåžžããã°ã©ã ã§ã¯”if”æãçšããŠæ¡ä»¶åå²ãè¡ããŸãããHaskellã§ã¯”guards”ãšããæ§æã䜿ããŸããããã«ãããã³ãŒããããèªã¿ããããããžãã¯ãæ確ã«ããŸãã
1.3 Haskellã䜿åŸãã¡ãªãã
Haskellã䜿ãæ倧ã®ã¡ãªããã¯ãé«ãæœè±¡åºŠãšçŽç²æ§ã«ããå®å šæ§ãšå¹çæ§ã§ããHaskellã§ã¯ãé¢æ°ãå¯äœçšãæããªããããè€éãªã·ã¹ãã ã§ãå ç¢æ§ãä¿ã€ããšãã§ããŸãã
ãŸããHaskellã®åã·ã¹ãã ã¯éåžžã«åŒ·åã§ãåå®å šãæäŸããå®è¡æãšã©ãŒãå€§å¹ ã«æžãããŸããäºåã«æ³å®å€ã®åäœããšã©ãŒãé²ãããšãå¯èœãªãããããã°ã©ã ã®å®å®æ§ãé«ãŸããŸãã
ããã«ãHaskellã¯äžŠè¡åŠçãé 延è©äŸ¡ããµããŒãããŠãããããããã©ãŒãã³ã¹ã®åäžããªãœãŒã¹ã®å¹ççãªå©çšãå®çŸããŸãã
1.4 Haskellã®åºæ¬çãªã©ã€ãã©ãªæŽ»çšæ³
Haskellã«ã¯æšæºã§è±å¯ãªã©ã€ãã©ãªãå«ãŸããŠããŸãããããã®ã©ã€ãã©ãªã掻çšããããšã§ãããã°ã©ããŒã¯ããå¹ççã«ã³ãŒããæžãããšãã§ããŸãã
äŸãã°ãæååæäœãè¡ãããã®”Data.Text”ã©ã€ãã©ãªããæ¥ä»ãæéã®åŠçãè¡ãããã®”Data.Time”ã©ã€ãã©ãªãªã©ããããŸããããããçšããããšã§ç¹å®ã®ã¿ã¹ã¯ãç°¡åã«åŠçããããšãã§ããŸãã
ãŸããHackageãããStackageããªã©ã®ãæ°å€ãã®å€éšã©ã€ãã©ãªãå ¬éãããŠãããããããå©çšããããšã§ããã«å€åœ©ãªããã°ã©ãã³ã°ãå¯èœãšãªããŸãã
2. Haskellã®ããŒã¿åã©ã€ãã©ãª
Haskell ã®ããã°ã©ã ãèšèšããäžã§ãããŒã¿åã¯äžå¯æ¬ ã§ããå¹ åºãçš®é¡ã®ããŒã¿åããããããããç°ãªãæäœãè¡ãã©ã€ãã©ãªãååšããŸãããªã¹ããèŸæžåãã¿ãã«ããŠãŒã¶ãŒå®çŸ©åãšåŒã°ããããŒã¿åã©ã€ãã©ãªã®äžéšã詳ãã解説ããŸãã
ããŒã¿åã©ã€ãã©ãªã¯ãã³ãŒããè«ççãã€ä¿å®æ§ã®é«ããã®ã«ããæå©ããããŸããããã«ããããã®ã©ã€ãã©ãªã¯äžè²«æ§ãšåå©çšæ§ã確ä¿ããã³ãŒãã®å¯èªæ§ãšå¹çæ§ãæ¹åããåãæã£ãŠããŸãã
ããã§ã¯ããããã®ããŒã¿åã©ã€ãã©ãªã®æäœæ¹æ³ãåŠã³ãéçºè ãšããŠã®ã¹ãã«ã»ããã匷åããããšæããŸããããã§ã¯ãäžã€ãã€èŠãŠãããŸãããã
2.1 ãªã¹ãã®æäœ
ãªã¹ãã¯Haskellã®åºæ¬çãªããŒã¿æ§é ã§ãè€æ°ã®èŠçŽ ãå«ãããšãã§ããŸãããªã¹ãæäœã©ã€ãã©ãªã«ã¯ãèŠçŽ ã®è¿œå ãåé€ãæ€çŽ¢ãªã©å€æ°ã®æ©èœãæäŸãããŠããŸãã
äŸãã°ããListãã©ã€ãã©ãªã¯ãèŠçŽ ã®è¿œå ãåé€ã«ãŠã¿ãªãã£é¢æ°ãæäŸãããªã¹ãã®ç·åãæ倧å€ãèšç®ããããã®äŸ¿å©ãªé¢æ°ãæäŸããŸãã
ãŸãããªã¹ããæ±ãäžã§ããäžã€éèŠãªã©ã€ãã©ãªãšããŠãList.ExtraãããããŸããããã¯ãå é ãæ«å°Ÿã®èŠçŽ ãååŸãããããªã¹ããç¹å®ã®æ¡ä»¶ã§ãã£ã«ã¿ãªã³ã°ããããã䟿å©ãªé¢æ°ãæäŸããŸãã
2.2 èŸæžåã®æäœ
èŸæžåã¯ããŒãšå€ã®ãã¢ãæ ŒçŽããããŒã¿æ§é ã§ãããData.Mapãã©ã€ãã©ãªã¯ãèŠçŽ ã®æ¿å ¥ãåé€ãæ€çŽ¢åã³æŽæ°ãšãã£ãåºæ¬çãªèŸæžæäœããµããŒãããŸãã
ãŸãããHashMapãã©ã€ãã©ãªã¯ãé«éãªããŒã«ããèŠçŽ ã®ã¢ã¯ã»ã¹ãæäŸããŸããããã¯ç¹ã«å€§éã®ããŒã¿ãæ±ãå Žåã«æçšã§ãã
ããã«ããData.IntMapãããã³ãData.Setãããã䜿ãããŸããããããæŽæ°ãããŒãšããããããšããŒã®ã¿ãèŠçŽ ãšããã»ããããµããŒãããŠãããç¹å®ã®ããŒãºã«å¯Ÿå¿ããŸãã
2.3 ã¿ãã«ã®æäœ
ã¿ãã«ã¯ç°ãªãåã®å€ããŸãšããã®ã«é«ãè©äŸ¡ãããŸãããTupleãã©ã€ãã©ãªã§ã¯ãã¿ãã«ã®äœæãšèŠçŽ ã®ã¢ã¯ã»ã¹æ¹æ³ãæäŸããŸãã
ãData.Tuple.Extraããã¿ãã«ã®æäœã«å©çšã§ããã©ã€ãã©ãªã§ãã¿ãã«ã®èŠçŽ ã®äº€æãã¿ãã«ã®ãªã¹ãããªã¹ãã®ã¿ãã«ã«å€æãããªã©ç¹æ®ãªæäœãæäŸããŸãã
ãããã®ã©ã€ãã©ãªã䜿ãããšã§ãçµã¿åããã®èšç®ãè€æ°ã®æ»ãå€ã®çºçããªã©å€ãã®å Žé¢ã§æŽ»èºããŸãã
2.4 ãŠãŒã¶ãŒå®çŸ©åã®æäœ
Haskellã§ã¯ãç¹å®ã®ç®çã«åãããŠèªç±ã«ããŒã¿åãå®çŸ©ããããšãã§ããŸãããã®ãããªãŠãŒã¶ãŒå®çŸ©åãæ±ãããã®ã©ã€ãã©ãªãå€ãååšããŸãã
å ·äœçã«ã¯ããData.Typeableãã©ã€ãã©ãªããããŸããããã¯ãåã®æ å ±ãå®è¡æã«æäŸããããšãå¯èœã«ããŸãã
ãŸãããData.Dataãã©ã€ãã©ãªã¯ããData.Typeableãã«å ããŠããžã§ããªãã¯ããã°ã©ãã³ã°ããµããŒããããŠãŒã¶ãŒå®çŸ©åã®èŠçŽ ã«ã¢ã¯ã»ã¹ããéã«å€ãã®æè»æ§ãæäŸããŸãã
3. Haskellã®é¢æ°åããã°ã©ãã³ã°ã©ã€ãã©ãª
é¢æ°åèšèªãšããŠç¥ãããHaskellã§ã¯ãå€ãã®åŒ·åãªã©ã€ãã©ãªã«æ¯ããããŠããŸãããããã®ã©ã€ãã©ãªã®äžã«ã¯ãé¢æ°åããã°ã©ãã³ã°ãããæå¹ã«æŽ»çšããããã®ã©ã€ãã©ãªãå€ãååšããŠããŸããåã ã®ã©ã€ãã©ãªã®ç¹åŸŽãå©çšæ³ãç解ããããšã§ãè€éãªåé¡ã«å¯Ÿãã解çãå¹ççã«åŸãããšãã§ããŸããæ¬ç¯ã§ã¯ããã®äžã§ãç¹ã«ä»£è¡šçãªãã®ãåãäžããŠã¿ãŸãããã
Haskellã®é¢æ°åããã°ã©ãã³ã°ã©ã€ãã©ãªã¯ãé«éé¢æ°ãã¢ãããã©ã ãåŒãé 延è©äŸ¡ãšãã£ãæ©èœãäžå¿ã«æ§æãããŠããŸãããããã®æ©èœãèåããé¢æ°åèšèªã®ç¹æ§ã¯ãèšç®ã®ããã»ã¹ãéåžžã«çè«çãã€å³å¯ã«èšè¿°ããããšãå¯èœã«ããŸãã
ãŸããé¢æ°åããã°ã©ãã³ã°ã©ã€ãã©ãªã¯æ°åŠçæŠå¿µã«åºã¥ããŠèšèšãããŠããããã確å®æ§ãšä¿¡é Œæ§ãéèŠãããŸãããã®ç¹æ§ã¯ã倧èŠæš¡ã§è€éãªã·ã¹ãã ã®èšèšãæ§ç¯ããã¹ããè¡ãéã«éåžžã«æå¹ã§ãããŸãã¯ããããã®ç¹åŸŽãšå©çšæ³ã詳ããèŠãŠãããŸãããã
3.1 é«éé¢æ°ã®å©çš
é«éé¢æ°ãšã¯ãä»ã®é¢æ°ãåŒæ°ãšããŠåãåãããŸãã¯çµæãšããŠæ°ããªé¢æ°ãè¿ãé¢æ°ã®ããšãæããŸããHaskellã®ã©ã€ãã©ãªã§ã¯ããã®é«éé¢æ°ãå€æ°çšæãããŠããŸãã
Haskellã®ããã°ã©ã ã§ã¯ãäŸãã°ãmapããfilterããªã©ã®é«éé¢æ°ãé »ç¹ã«äœ¿çšããŸãããããã®é¢æ°ã掻çšããããšã§ãç¹°ãè¿ãåãåŠçãè¡ãããžãã¯ãã¯ãªãŒã³ã«èšè¿°ããããšãå¯èœã«ãªããŸãã
ãŸããé«éé¢æ°ã¯ã³ãŒãã®åå©çšæ§ãé«ããã³ãŒãéãåæžããããã°ã©ã ãã·ã³ãã«ã«ä¿ã€ããšãã§ããŸããèŠããã«ãå¹çããå®å šãªã³ãŒããæžãããã«é«éé¢æ°ã¯æ¬ ãããªãããŒã«ã§ãã
3.2 ã¢ãããšãã®å©çšæ³
ã¢ããã¯ãHaskellã®é¢æ°åããã°ã©ãã³ã°ã®äžæ žãšãªãæŠå¿µã®äžã€ã§ããã¢ããã¯ãé決å®æ§èšç®ãäŸå€åŠçãç¶æ ã®åæ±ããªã©ãäžèŠãããšçŽç²é¢æ°åèšèªã§é£ãããšæãããã¿ã¹ã¯ããçŽç²ãªåœ¢ã§æäŸããŸãã
ãã®ã¢ãããé¢æ°ãšããŒã¿ã®äž¡æ¹ããããã¥ã¬ãŒãããããšã§ãäŸãã°éçŽç²ãªå ¥åºååŠçããçŽç²ãªé¢æ°åããã°ã©ãã³ã°ã®äžçã§ãã³ããªã³ã°ããããšãå¯èœã«ãªããŸãã
ã¢ããã®èšèšç念ãšããŠã¯ãå¯äœçšã®ããæäœãåãæ±ãããã®ãã¬ãŒã ã¯ãŒã¯ãæäŸããããšãæããããŸããããã«ããHaskellã®çŽç²ããä¿ã£ããŸãŸãéçŽç²ãªåŠçãå°å ¥ããããšãã§ããŸãã
3.3 ã©ã ãåŒãšãã®å©çšæ³
ã©ã ãåŒã¯ãäžæçã«äœæãã䜿çšãããããã®å¿åé¢æ°ãè¡šããŠããŸããã©ã ãåŒã¯ãé¢æ°ãå¿ èŠãªå Žæã§äžæçã«é¢æ°ãå®çŸ©ããããã䜿çšããããšãã§ããŸãã
Haskellã§ã¯ãã©ã ãåŒã䜿ãããšã§ãç¹å®ã®äžæçãªåŠçãèšè¿°ããããã®å¥éé¢æ°ãå®çŸ©ããæéãçãããšãå¯èœã«ãªããŸãã
ãŸããã©ã ãåŒã¯é¢æ°åããã°ã©ãã³ã°ã®æèã§äžè²«æ§ãä¿ã€ããã«éèŠãªæ©èœã§ããé«éé¢æ°ãšãšãã«äœ¿çšãããããšãå€ãã©ã ãåŒã¯ãHaskellã«ãããããã°ã©ã ã®è¡šçŸåã倧ãã«é«ããŸãã
3.4 é 延è©äŸ¡ãšãã®å©çšæ³
Haskellã¯é 延è©äŸ¡ïŒãããã¯é 延å®è¡ïŒãæ¡çšããŠããŸããé 延è©äŸ¡ãšã¯ãå¿ èŠã«ãªããŸã§èšç®ãé ãããæè¡ã§ãã
é 延è©äŸ¡ã®å©ç¹ã¯ãäžèŠãªèšç®ãçãããšãã§ããèšç®å¹çãåäžãããããšãã§ããç¹ã§ãã
ãŸããé 延è©äŸ¡ã«ããç¡éã®ããŒã¿æ§é ã®è¡šçŸããååž°çãªããŒã¿æ§é ã®æ±ãã容æã«ãªããŸãããããã®ç¹æ§ã¯ãHaskellã倧èŠæš¡ãªããŒã¿åŠçã«å¯ŸããŠå¯Ÿæã§ãã匷åãªæŠåšãæäŸããŠããŸãã
4. Haskellã®äžŠè¡åŠçã©ã€ãã©ãª
Haskellã¯ãé«éãªäžŠè¡åŠçãå¯èœãªãã¬ãŒã ã¯ãŒã¯ãæã€åªããããã°ã©ãã³ã°èšèªã§ããä»åã¯ããã®äžã§ãäºäŸãšå ·äœçãªäœ¿ãæ¹ãå«ãHaskellã®äžŠè¡åŠçã©ã€ãã©ãªã«è§ŠããŠãããŸãã
å ·äœçã«ã¯ã䞊è¡åŠçã®åºæ¬ãããå ·äœçãªäœ¿çšäŸããããŠæ³šæãã¹ããã€ã³ããŸã§ãé ã«è§£èª¬ããŸãã
ãããäžç·ã«Haskellã®é åãšãã®æŽ»çšæ³ãæ·±ãæãäžããŠã¿ãŸãããïŒ
4.1 䞊è¡åŠçãšã¯
ãŸãã¯åºæ¬çãªç¥èããç解ããŸãããã䞊è¡åŠçãšã¯äœã§ããããïŒ
ããã¯ãè€æ°ã®ã¿ã¹ã¯ãåæã«å®è¡ããããšãæããŸãããã®ãããªåœ¢æ ã®ããã°ã©ãã³ã°ã¯å¹çåã®ããã«éåžžã«éèŠã§ãç¹ã«ãããã¯ãŒã¯ã®I/O(å ¥åºå)æäœããé·æéå¿ èŠãªèšç®ã«åœ¹ç«ã¡ãŸãã
äžæ¹ã䞊è¡åŠçã¯é©åã«ç®¡çããªããã°ãäºæããªããã°ã®åå ãšãªãããã管çã®èŠç·ãé¢ããªãããšãæ±ããããŸãã
4.2 䞊è¡åŠçã®åºæ¬
Haskellã®äžŠè¡åŠçã©ã€ãã©ãªã®åºæ¬çãªå©çšæ¹æ³ã玹ä»ããŸãã
Haskellã§ã®äžŠè¡åŠçã¯ãã¹ã¬ããã®çæãšæäœãå¯èœãªã©ã€ãã©ãªããControl.Concurrentããå©çšããŸãããã®ã©ã€ãã©ãªã«ã¯ãã¹ã¬ããã®çæãéä¿¡ãæäœã«å¿ èŠãªé¢æ°ãå«ãŸããŠããŸãã
ãŸããHaskellã§ã¯IOã¢ã¯ã·ã§ã³å ã§ã®ã¿äžŠè¡åŠçãå®è¡ããããšãå¯èœã§ãã匷åãªåã·ã¹ãã ã«ãããIOæäœãè¡ãç®æãæ確ã«åããç¹æ§ããããå®çŸããŠãããšèšããŸãã
4.3 䞊è¡åŠçã®å©çšäŸ
Haskellã®Control.Concurrentã©ã€ãã©ãªã䜿ã£ã䞊è¡åŠçã®å ·äœçãªäœ¿çšäŸã«ã€ããŠèŠãŠã¿ãŸãããã
äŸãã°ã2ã€ã®ã¿ã¹ã¯ã䞊åã«å®è¡ããããªãã次ã®ããã«èšè¿°ããããšãã§ããŸãããforkIOãé¢æ°ãçšããŠæ°ããã¹ã¬ãããçæããããããã«ã¿ã¹ã¯ãå²ãåœãŠãŸãã
ãã®ããã«Haskellã®äžŠè¡åŠçã©ã€ãã©ãªã䜿ããšãéåæèšç®ãè¡ãããšãå¯èœãšãªããããã°ã©ã ã®ããã©ãŒãã³ã¹ãåäžãããããšãæåŸ ã§ããŸãã
4.4 䞊è¡åŠçã®æ³šæç¹
䞊è¡åŠçã©ã€ãã©ãªã䜿çšããéã®æ³šæç¹ãããã€ã玹ä»ããŸãã
ãŸãã䞊è¡ããã°ã©ãã³ã°ã¯èª€ããçºçãããããããã泚æãå¿ èŠã§ããäŸãã°ãããŒã¿ç«¶åããããããã¯ãªã©ã®åé¡ãèµ·ããåŸãŸãããããé²ãæ段ãšããŠãHaskellã¯ããŸããŸãªåæããªããã£ããæäŸããŠããŸãã
ãŸããHaskellã§ã¯ãçŽç²æ§ãæšãŠãããšãªã䞊è¡åŠçãè¡ãããšãã§ããŸããããã¯ãåã·ã¹ãã ãIOãšãããµã€ããšãã§ã¯ãã ããèš±å¯ããããã§ãããã®ãããHaskellã®äžŠè¡ããã°ã©ãã³ã°ã¯å®å šãã€å¹æçã«è¡ããŸãããããã§ã䞊è¡åŠçã®åºæ¬çãªæ³šæç¹ãææ¡ããŠããããšã¯éèŠã§ãã
5. Haskellã®ç¶²çŸ çãªã©ã€ãã©ãªãªã¹ã
Haskellã¯éåžžã«ãŠããŒã¯ã§çŸä»£çãªããã°ã©ãã³ã°èšèªã§ããããã®ç¹åŸŽãæ倧éã«åŒãåºãããã®è±å¯ãªã©ã€ãã©ãªãçšæãããŠããŸããããã§ç§ãã¡ã玹ä»ããã©ã€ãã©ãªã¯ãHaskellã®ãã¯ãŒãäœæããããã§ããããå¹ççã§çç£çã«ããã°ã©ãã³ã°ãè¡ãããã«ããã®äŸ¡å€ãååã«èªèããŠããã ããããšã§ãããã
Haskellã®ã©ã€ãã©ãªã¯å€çš®å€æ§ã§ããããã®äžããã©ããéžã¶ã¹ãã決ããã®ã¯é£ãããããããŸããããã®ãããç§ãã¡ã¯ç¹ã«è©äŸ¡ãé«ãããŸãã¯ç¹å®ã®ããã°ã©ãã³ã°ããŒãºã«é©ããã©ã€ãã©ãªãäžå¿ã«éžã³ãŸããã
ããã§ã¯ãéèŠãªã«ããŽãªãŒããšã«ãHaskellã§å©çšå¯èœãªåªããã©ã€ãã©ãªãèŠãŠã¿ãŸãããã
5.1 Webããã°ã©ãã³ã°ã©ã€ãã©ãª
Webéçºã¯çŸä»£ã®æè¡é åã«ãããŠæãéèŠãªäžéšã§ããããã®ããHaskellããŸãWebéçºè ã«å¯ŸããŠåªããæ¯æŽãæäŸããŠããŸããäŸãã°ãYesodã¯éåžžã«å æ¬çãªWebãã¬ãŒã ã¯ãŒã¯ã§ãã¬ã³ããªã³ã°ãã«ãŒãã£ã³ã°ãããŒã¿æ°žç¶åãªã©ã®äžé£ã®äœæ¥ãã¹ã ãŒãºã«è¡ããŸãã
Scottyã¯ãã·ã³ãã«ããéèŠããWebãã¬ãŒã ã¯ãŒã¯ã§ãããRESTfulã¢ãŒããã¯ãã£ã«åºã¥ãã軜快ãªWebã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯ãå¯èœã«ããŸãããŸããServantã¯Web APIã®èšè¿°ã«ç¹åããã©ã€ãã©ãªã§ãåãéããŠAPIã®èšèšãè¡ãããšãã§ããŸãã
ãããã¯ãã¹ãŠéåžžã«äººæ°ããããæçšã§ãããæè¡ã¹ã¿ãã¯ã«ãã£ãŠäœ¿ãåããããšãå¯èœã§ãããããã®ã©ã€ãã©ãªãå©çšããããšã§ãããªãã®Haskell Webéçºãããžã§ã¯ãã¯å¥œè©ãåããããšã§ãããã
5.2 ããŒã¿ããŒã¹æ¥ç¶ã©ã€ãã©ãª
ããŒã¿ããŒã¹ãšã®ãããšãã¯ã»ãšãã©ã®ã¢ããªã±ãŒã·ã§ã³ã§å¿ é ã®äžéšã§ãããHaskellã¯ããã«ã察å¿ããŠããŸããPersistentã¯è±å¯ãªæ©èœãæäŸããYesodãšäžç·ã«äœ¿ãããããšãå€ãããŒã¿ããŒã¹æœè±¡åã©ã€ãã©ãªã§ãã
ãŸãHDBCã¯ããŒã¿ããŒã¹æ¥ç¶ã®ããã®å¥ã®ãªãã·ã§ã³ã§ãéåžžã«çŽæçã§ãããªãããã¬ãã·ããªãã£ãæäŸããŸããããã«ãOpaleyeã¯PostgreSQLåãã®ã©ã€ãã©ãªã§ãSQLã®äœ¿ãæããšHaskellã®åå®å šæ§ãçµã¿åãããŠããŸãã
ãããã®ã©ã€ãã©ãªã掻çšããããšã§ãããŒã¿ããŒã¹ããã®ããŒã¿ååŸãããŒã¿ã®æŽæ°ãšãã£ãåºæ¬çãªã¿ã¹ã¯ãå¹æçã«åŠçããããšãã§ããŸãã
5.3 ãã¹ããã¬ãŒã ã¯ãŒã¯ã©ã€ãã©ãª
è¯è³ªãªããã°ã©ã ãæäŸããäžã§ããã¹ãã¯éèŠã§æ¬ ãããŸãããHaskell ã³ãã¥ããã£ããã¹ãã®éèŠæ§ãç解ããŠããããã®ããã«å€ãã®åªãããã¹ãã©ã€ãã©ãªãéçºãããŠããŸããHUnitã¯åºã䜿çšãããŠãããŠããããã¹ãã©ã€ãã©ãªã§ãã
äžæ¹ãQuickCheckã¯ãã©ã³ãã ãªãã¹ãã±ãŒã¹çæãšããããã£ãŒããŒã¹ã®ãã¹ããæ¯æŽãã匷åãªã©ã€ãã©ãªã§ããããã«ãããäºæ³å€ã®å ¥åã«å¯Ÿããããªãã®ã³ãŒãã®å¯Ÿå¿æ§ã確èªããããšãã§ããŸãã
Tastyã¯ä»ã®ãã¹ããã¬ãŒã ã¯ãŒã¯ãã©ã€ãã©ãªãçµ±åããå€æ©èœã®ãã¹ãã¹ã£ãŒããäœæããããã®ã©ã€ãã©ãªã§ãããããã®ã©ã€ãã©ãªã¯å šãŠãéçºãããŒãæ¯ããã³ãŒãã®å質ã確ä¿ããäžã§ invaluable ãªååšã§ãã
5.4 ããŒã¹ã»ã¢ã«ãŽãªãºã ã©ã€ãã©ãª
Haskellã¯ãããŒãµãŒãã¢ã«ãŽãªãºã ã®å®è£ ã«éåžžã«åªããŠããŸããParsecã¯åŒ·åã§åºã䜿ãããŠããããŒãµãŒã³ã³ãããŒã¿ã©ã€ãã©ãªã§ãè€éãªæ§æã®ããŒã¹ã容æã«ããŸãã
äžæ¹ãmegaparsecã¯Parsecã«è§Šçºãããã©ã€ãã©ãªã§ããšã©ãŒã¡ãã»ãŒãžã®çæãšåŸæ¹äºææ§ã«æ¹åãå ããŠããŸãããŸããattoparsecã¯é«éãªããŒã¹ãæ±ããããå Žé¢ã«é©ããŠããŸãã
ãããã®ã©ã€ãã©ãªã«ãããè€éãªããŒã¿åœ¢åŒãåãæ±ãããããæå³ã®ããæ å ±ã«å€æãããšããHaskellã®åŒ·ã¿ãæ倧éã«åŒãåºãããšãã§ããŸãã
6. Haskellã©ã€ãã©ãªã®ã€ã³ã¹ããŒã«æ¹æ³ãšæŽ»çšã®ã³ã
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãHaskellã©ã€ãã©ãªã®ã€ã³ã¹ããŒã«æ¹æ³ãšãããããæ倧éã«æŽ»çšããããã®åºæ¬çãªæ¹éã解説ããŸãããŸããã©ã€ãã©ãªå©çšäžã«ééããå¯èœæ§ã®ãããšã©ãŒããã®å¯ŸåŠæ³ãããã«ã¯å®éã®éçºã®çŸå Žã§åœ¹ç«ã€ãã¹ããã©ã¯ãã£ã¹ã«ã€ããŠã觊ããŠãããŸãã
Haskellã©ã€ãã©ãªã¯ã³ãŒãã£ã³ã°ã®å¹çåãæ¡åŒµæ§ãæ Œæ®µã«é«ããããã®éèŠãªéå ·ã§ããããããã«ãæ£ããé 眮ããé©åã«ç®¡çããããšãéèŠãšãªããŸãã
ã§ã¯ããŸãæåã«Haskellã©ã€ãã©ãªã®ã€ã³ã¹ããŒã«æ¹æ³ã«ã€ããŠèŠãŠãããŸãããã
6.1 ã©ã€ãã©ãªã®ã€ã³ã¹ããŒã«æ¹æ³
éåžžãHaskellã®ã©ã€ãã©ãªã¯ãcabalããŸãã¯ãstackããšåŒã°ãããã«ãããŒã«ã䜿çšããŠã€ã³ã¹ããŒã«ããŸãããããã®ããŒã«ã¯ãã©ã€ãã©ãªã®äŸåé¢ä¿ã管çããããã³ãŒãã®ãã«ãããã¹ããè¡ãããã®ãã®ã§ãã
äŸãã°ããcabalãã䜿çšããŠã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããå Žåãã¿ãŒããã«äžã§ãcabal install [ã©ã€ãã©ãªå]ããšããã³ãã³ããå®è¡ããŸãããstackãã䜿çšããå Žåã¯ããstack build [ã©ã€ãã©ãªå]ããšå®è¡ããŸãã
ãããã®ã³ãã³ããå®è¡ããã°ãæå®ããã©ã€ãã©ãªãèªåçã«ããŠã³ããŒãããã³ã€ã³ã¹ããŒã«ãããããªãã®Haskellç°å¢ã«çµ±åãããŸãã
6.2 ã©ã€ãã©ãªã®æŽ»çšã®åºæ¬æ¹é
Haskellã©ã€ãã©ãªãå¹æçã«æŽ»çšããããã®åºæ¬æ¹éãšããŠã¯ããŸããã®äœ¿ãæ¹ããã£ãããšç解ããããšãæãéèŠã§ããã©ã€ãã©ãªã¯å€ãã®å Žåãããã¥ã¡ã³ããŒã·ã§ã³ãæäŸããããããè³æãèªã¿é²ããŠãã®æ©èœã䜿ãæ¹ããã¹ã¿ãŒããŸãããã
ãŸããé©åãªã©ã€ãã©ãªãéžæããããšã倧åã§ããé«ã¬ãã«ã®æ©èœæ§ãæäŸããã©ã€ãã©ãªãååšããŸãããäžæ¹ã§ãå°ããªåé¡ã解決ããããã®ã·ã³ãã«ãªã©ã€ãã©ãªãååšããŸããåé¡ãç解ããããã«å¯ŸããŠæé©ãªã©ã€ãã©ãªãéžæããããšãå¹ççãªéçºã®ããã®éµã«ãªããŸãã
ãããŠãã©ã€ãã©ãªã掻çšããäžã§éèŠãªã®ã¯ã䜿ãããªããããšããããã®æ©èœæ§ãç解ããå¿ èŠãªãšãã«æŽ»çšããã°ãããšããããšã§ã
6.3 ã©ã€ãã©ãªå©çšäžã®ãšã©ãŒãšå¯ŸåŠæ³
ã©ã€ãã©ãªã䜿çšããéã«ã¯ãåçš®ãšã©ãŒãçºçããããšããããŸããã©ã€ãã©ãªã«ã¯ããŒãžã§ã³ãååšããããããã®ããŒãžã§ã³ã«ã¯ç¬èªã®äŸåé¢ä¿ããããŸãããããã®äŸåé¢ä¿ãäžèŽããªãå Žåããšã©ãŒãçºçããããšããããŸãã
ãã®ãããªå Žåã«ã¯ããcabalãããstackããªã©ã®ãã«ãããŒã«ã䜿çšããŠäŸåé¢ä¿ã解決ããŸãããã«ãããŒã«ã¯ãèªåçã«äŸåé¢ä¿ã解æããæ¬ èœããŠãããã®ãã€ã³ã¹ããŒã«ããæ©èœãæã£ãŠããŸãã
ãã ããäŸç¶ãšããŠãšã©ãŒã解æ¶ããªãå ŽåãããŒãžã§ã³ã®è¡çªãåå ã§ããå¯èœæ§ããããŸãããã®å Žåãåé¡ã®ããŒãžã§ã³ã確èªããå¿ èŠãªãããŒãžã§ã³ãäžãããªã©ã®å¯ŸåŠãè¡ããŸãã
6.4 掻çšäžã®ã³ãããã³ãã¹ããã©ã¯ãã£ã¹
æåŸã«ãHaskellã©ã€ãã©ãªã掻çšããäžã§ã®ããã€ãã®ã³ãã«ã€ããŠçŽ¹ä»ããŸãããŸãã1ã€ã¯ã©ã€ãã©ãªã®éžæã§ãã䟿å©ãªã©ã€ãã©ãªã¯ãããããããŸããããã®å šãŠã䜿ãå¿ èŠã¯ãããŸãããèªåã®ç®çã«æé©ãªã©ã€ãã©ãªãèŠã€ããããšãæè¯ã®è§£æ±ºçãšãªããŸãã
ãŸãããœãŒã¹ã³ãŒããèªãç¿æ £ãã€ããããšãéèŠã§ããããã«ãããã©ã€ãã©ãªãã©ã®ããã«åäœããŠããã®ããç解ãããããèªåã®ã³ãŒãã«çããããšãå¯èœã«ãªããŸãã
æåŸã«ãäžæç¹ãããã°ãã©ã€ãã©ãªã®äœè ãã³ãã¥ããã£ã«åãåãããããšãæããªãã§ãã ãããHaskellã®ã³ãã¥ããã£ã¯ãšãŠã芪åã§ååçã§ããçåãåé¡ã解決ããããã«ãç©æ¥µçã«ã³ãã¥ããã£ã«åå ããŸãããã