èªåã¯æ ãè ã®ã¢ããã¥ã¢åç家ã ãšæããŸãã ç§ã«ã¯è¯ãããã©ãŒã¬ã¹ãã©ãŒãããããŸããæã ãèªåã®åšãã®äœããã¯ãªãã¯ããããšãã欲æ±ã«è¥²ãããŸãã ããããç§ã¯æ ãè ã§ãããçµæã®åçã¢ãŒã«ã€ããããããåããæéã欲æããããŸããã ååãšããŠãã«ã¡ã©ãHDMIã±ãŒãã«ã§ãã¬ãã«æ¥ç¶ããããšã§ãæ®åœ±åŸããã«1ã2ååçãèŠãããšãã§ããŸãã ãã®åŸãåçã¯
å 責äºé
ç§ã¯é¢æ°åããã°ã©ãã³ã°ã®ç¬¬äžäººè ã®ãµããããŸãããç§ãæžããã³ãŒãã¯ã²ã©ããã®ã ãšèªããŠããŸãïŒçµå±ãHaskellã¯æãªãšãã«2ãæ以äžéå¯æ¥ã«ãã£ãŠããŸãïŒãããã«ãæ£ããåäœããªãå¯èœæ§ããããŸãã ãã®èšäºã®ç®çã¯ãHaskellãæªå€¢ãè€éãªæ°åŠçèšç®ã ãã§ãªããæ¥åžžçãªæ¥åžžçãªã¿ã¹ã¯ã«ã䜿çšã§ããæ±çšèšèªã§ããããšã瀺ãããšã§ãã ãããŠãããã«å®å šã«å¯ŸåŠããã
ãã®åé¡ã解決ããç¹å¥ãªããã°ã©ã ãååšããããšã¯æ¿ç¥ããŠããŸãããå¿ èŠãªããšãæ£ç¢ºã«è¡ãã·ã³ãã«ã§åºæ¬çãªãŠãŒãã£ãªãã£ãå¿ èŠã§ããã ãã®åé¡ã¯äžè¬çã«ããã€ãã®bashãŸãã¯perlã§è§£æ±ºã§ããããšãç¥ã£ãŠããŸãããããã¯èè ãã€ãŸãç§ãéžæãããã®ã§ãã
å§ããåã«
ããã¯é·åŒãå°å ¥ã®æåŸã®éšåã ãšæããŸãã æåã«ããã¡ãããHaskellã®åºæ¬çãªç¥èãæã£ãŠããããšãæãŸããã§ãããããªããšãå€ãã®ããšããããã«ãããããããŸããã ã¢ããã®ã¢ã€ãã¢ããããšããã§ããã ãã ãããã¬ãŒã³ããŒã·ã§ã³ã®ããã»ã¹ã«ãããã埮åŠãªãç¹ã«ã€ããŠèª¬æããããã«ããŸãããã®èšäºãçãããå°ãã§ãåªåããŠç解ããŠãããããšãé¡ã£ãŠããŸãã
第äºã«ãå¿ èŠãªããŒã«ã ããã«ããã¹ãŠã®ã€ãã³ãã¯Linuxãã·ã³äžã§å±éããããã®ãšæ³å®ãããŠããŸããããã€ããŒãªå€æŽãå ãããšãWindowsãããã«ã¯Mac OS Xã§ãåæ§ã«ãªããŸãã
- Haskellãã©ãããã©ãŒã ããã£ã¹ããªãã¥ãŒã·ã§ã³ã®ãªããžããªããããŠã³ããŒãããŠã€ã³ã¹ããŒã«ããŸãã
- EXIFã䜿çšããHaskellã©ã€ãã©ãªã
sudo cabal install --global exif
; - GTK + \ Gladeããã³å¯Ÿå¿ããHaskellã®ãã€ã³ãã£ã³ã°ã
sudo cabal install --global glade
ïŒsudo cabal install --global glade
ã
åé¡ã®å£°æ
ãã®ããã察å¿ãããã©ã«ããŒã«æ¥ä»ããšã«åçããããã¯ãããããã®æãç°¡åãªãŠãŒãã£ãªãã£ãå¿ èŠã§ããã ååãšããŠããã¹ãŠãè€éãªããšã¯äœããããŸããã
ã©ã®ããã«æ±ºå®ããŸãã
ãã¹ãŠãã·ã³ãã«ã§ãã ãŸãã2ã€ã®ã¢ãŒãããµããŒãããå¿ èŠããããŸãã
- ãèªåã-ã¹ãã£ã³ãããã£ã¬ã¯ããªãåŒæ°ãšããŠã³ãã³ãã©ã€ã³ã«æž¡ãããå Žåã
- ãæåã-åçŽãªGUIããã³ããšã³ããèµ·åãããåŠçãããã£ã¬ã¯ããªãåå¥ã«éžæããå Žåã
äžè¬çã«èšã£ãŠãGUIã¯ããã§ã¯ãŸã£ããå¿ èŠãããŸããããããã¯Haskellã®GUIã決ããŠæããªãããšã瀺ãäžè¬çãªå°ããªãã¬ãŒãã³ã°äŸã§ããããšãæãåºããŠãã ããã
ããã«ãã«ã¿ãã°ãã©ã®ããã«ã¹ãªããããããšããŠããå€ãã®ã«ã¡ã©ïŒãã¹ãŠã§ã¯ãªãã«ããŠãïŒãPHOTOãã©ã«ããŒã«æ éã«åçãå ¥ããŠããã100PANAã101PANAãªã©ã«ãã®ãã£ã¬ã¯ããªããã€ãã¹ããŸãïŒãã¹ãŠã®ãµããã£ã¬ã¯ããªããã€ãã¹ããããšãå«ãïŒã .pãïŒåãã¡ã€ã«ãåŠçããŸãã
åã ã®ãã¡ã€ã«ã®åŠçã¯éåžžã«ç°¡åã§ããExifããŒã¿ãèªã¿åããããããã°ãæœåºããæ¥ä»ã«å¯Ÿå¿ãããã£ã¬ã¯ããªã«ããïŒåçãã¡ã€ã«ïŒãã³ããŒããŸãã
æãã§ãããªããŠããããã°ã©ã ãäœããã¹ãããäŒããéçšã§ããã®3ã€ã®äž»ãªæ©èœã説æããŸããã
- ããã°ã©ã ãå®è¡ããåŒæ°ã確èªããŸãã
- ãã£ã¬ã¯ããªãã©ããŒãµã«ã
- ç¹å®ã®ãã¡ã€ã«ãåŠçããŸãã
ããã§ããã€ãã®ãœãŒã¹ã³ãŒããè¿œå ããŸãããã
ã³ãŒãã«ããè¿ã
åæ çãªäœè«ã Haskellããã°ã©ã ã¯ãCã®ããã«ã¢ãžã¥ãŒã«æ§é ãæã£ãŠããŸããããã¡ããã²ã©ãããããŒãã¡ã€ã«ã¯ãããŸããã ãšã¯ã¹ããŒããããïŒå€éšïŒé¢æ°ã¯ã¢ãžã¥ãŒã«ã®èª¬æã§æå®ãããä»ã®ã¢ãžã¥ãŒã«ãšã³ãŒãã®ã€ã³ããŒãããããŸãã Haskellããã°ã©ã ã¯ãããŒã¿åãšé¢æ°ã®èª¬æã®ã¿ã§æ§æãããŠããŸãã ããã ãã§ã
ããã§ã¯ãããäžåºŠå§ããŸãããã ã€ãŸããMainã¢ãžã¥ãŒã«ã®mainé¢æ°ã䜿çšããŸãïŒçµå±ãããã°ã©ã ãéå§ããã®ã¯ããã§ãïŒã ãããã¢ãžã¥ãŒã«å šäœã®ã³ãŒãã§ã
ã¡ã€ã³ïŒ
*ãã®ãœãŒã¹ã³ãŒãã¯ã ãœãŒã¹ã³ãŒããã€ã©ã€ã¿ãŒã§åŒ·èª¿è¡šç€ºãããŸããã
- ã¢ãžã¥ãŒã«ã¡ã€ã³
- ã€ã³ããŒãã·ã¹ãã ïŒgetArgsïŒ
- èŒžå ¥ãããŒãžã£ãŒ
- ã€ã³ããŒãGUI
- ã¡ã€ã³:: IOïŒïŒ
- main = getArgs >> =èµ·å
- -åçãžã®ãã¹ãå«ãåäžã®åŒæ°ãå¿ èŠã§ãããã以å€ã®å Žåã¯guiãå®è¡ããŸã
- èµ·å:: [æåå]-> IOïŒïŒ
- launch [x] = processDirectory x
- launch _ = startGUI
æåã®ã¢ãžã¥ãŒã«ã®èª¬æãããå°ã詳ãã説æããäž»ãªãã®ã説æããŸãã ãããã£ãŠãæåã®è¡ã¯ã¢ãžã¥ãŒã«ã®èª¬æã§ãã 次ã¯ã€ã³ããŒãè¡ã§ãïŒgetArgsé¢æ°ã®ã¿ãSystemã¢ãžã¥ãŒã«ããã€ã³ããŒããããå®è¡å¯èœãã¡ã€ã«ã®ååãªãã§ã³ãã³ãã©ã€ã³åŒæ°ã®ãªã¹ããè¿ããŸãïŒã ãããŒãžã£ãŒããã³GUIã¢ãžã¥ãŒã«ã«ã€ããŠã¯åŸè¿°ããŸãã
以äžã¯
main
æ©èœã®èª¬æã§ãã 説æã®æåã®è¡ã¯ãã¿ã€ãã®ãªãã·ã§ã³ã®å®çŸ©ã§ãããäžè¬çã«ã¯ãå¿ ãããå¿ èŠã§ã¯ãããŸãããã»ãšãã©ã®å Žåãé¢æ°ã®ã¿ã€ãã¯ãæäŸãããåŒæ°ã®ã¿ã€ãããæšæž¬ã§ããŸãã é¢æ°ã¯æ¹çšåŒç³»ã§èšè¿°ããã2è¡ç®ã¯ãã®æ¹çšåŒã§ãã
åæ çãªäœè«ã æ£åŒã«ã¯ããã¹ãŠã®æ©èœã¯ã¯ãªãŒã³ã§ãããŒãã£ãã«åé¡ã§ããå¯äœçšããããŸãã ç§ã¯æã§èª¬æããããšããŸãã
é¢æ°ã¯ãåãå ¥åããŒã¿ã§åãåºåããŒã¿ãçæããã·ã¹ãã ã®ç¶æ ãå€æŽããããããã«äŸåããªãïŒãã¡ã€ã«ã·ã¹ãã ã®ç¶æ ããŸãã¯éããŠããTCPæ¥ç¶ã®ååšïŒå Žåãã¯ãªãŒã³ã§ãã äŸãšããŠè¿œå æ©èœãåãäžããŸãã 2ã€ã®åŒæ°ãåãããããã®åŒæ°ã®äž¡æ¹ãæ°å€2ã«çããå Žåãåºåã§ã¯åžžã«ïŒçµ¶å¯Ÿã«åžžã«ïŒæ°å€4ãååŸããŸãããããŠãã¯ããTCPæ¥ç¶ãè¿œå ããæ©èœã¯éããŸããã
å¯äœçšã®ããé¢æ°ã¯å¥ã®äŒè©±ã§ãããããã¯ã å ¥å/åºåã¢ããïŒIOã¢ããïŒãšåŒã°ããã¢ãã«ãä»ããŠãå€éšã®å åã«å¯Ÿããé¢æ°ã®äŸåé¢ä¿ã瀺ãããã«èæ¡ããããã®ã§ãã èªèãç°¡åã«ããããã«ãçŸæç¹ã§ã¯ãå ¥å/åºåãã®ã³ã³ããã¹ãã§ã®ã¿ã¢ããã«ã€ããŠèããŸãïŒå®éããã®æŠå¿µã¯ã¯ããã«åºãã§ãïŒã å¯äœçšã®ããé¢æ°ã¯ã ã¢ã¯ã·ã§ã³ã®ã·ãŒã±ã³ã¹ã®èšè¿°ã§ããããã®çµæãç¹å®ã®çµæå€ãååŸããŸãã äŸïŒ
readFile :: FilePath -> IO (String)
ã¯ããã®ãã¡ã€ã«ãžã®æå®ããããã¹ã«ãããã¡ã€ã«ãèªã¿åãé¢æ°ã§ãã ããæ£ç¢ºã«ã¯ãããã¯é¢æ°ã§ã¯ãªãããã®ã¿ã€ãã§ãã é¢æ°ã®ã¿ã€ããèªãã®ã¯éåžžã«ç°¡åã§ããæåã«é¢æ°ã®ååãæ¥ãŸãã次ã«ãèšå·ãä»ãã2ã€ã®ã³ãã³ã®åŸã«->é¢æ°ã®åŒæ°ãåé¢ããã極端ãªåŸã«->æ»ãå€ã®ã¿ã€ãããããŸãã ããã¯åºæ¬çãªèª¬æã§ãããä»ã®ãšããã¯ããã§ååã§ãã ã€ãŸããé¢æ°ãç¹å®ã®FilePathãåãå ¥ããå ¥å/åºåã¢ã¯ã·ã§ã³ãè¿ãããã®å®è¡ã«ããæååå€ãåŸãããããšãããããŸãã
ã¢ã¯ã·ã§ã³ã®ã·ãŒã±ã³ã¹ãç解ããããšãéèŠã§ãïŒ=èšç®ã®ã·ãŒã±ã³ã¹ã å®éã éåžž ãèšç®ãå®éã«è¡ãããé åºã¯æ£ç¢ºã«ã¯ããããŸãããèšç®ã®é ãã決å®ããã ãã§ãã ãããã£ãŠãã¢ãããªã©ã®æœè±¡åã®ååšã¯ãHaskellãå¿ é ã«ãããã®ã§ã¯ãããŸããã
ãããã£ãŠã
main
ã«æ»ããŸãã åŒæ°ãåãããæããã«I / Oã¢ã¯ã·ã§ã³ãè¿ããŸãã ãã®ã¢ã¯ã·ã§ã³ã®å®è£ ã¯ãããã°ã©ã å šäœã®å®è¡ã§ãã ãããããã§ãããåãåã£ãããã°ã©ã å šäœã«åäžã®çŽç²ãªé¢æ°ãæžãããŠããããã§ã¯ãªããå©çšå¯èœãªãã¹ãŠã®ãã¥ãŒããªã¢ã«ãšã¯ãŸã£ããç°ãªããŸãããããã¯ããã°ã©ã ã解決ããåé¡ã§ãã ã¢ã¯ã·ã§ã³ã®ã·ãŒã±ã³ã¹ã¯ã2ã€ã®åŒæ°ãåãé¢æ°
>>=
ããã³
>>
ã«ãã£ãŠæ±ºå®ãããŸãã æåã®ã±ãŒã¹ã§ã¯ãå·ŠåŽã®ã¢ã¯ã·ã§ã³ã®çµæãåŒæ°ãšããŠå³åŽã®é¢æ°åŒã³åºãã«æž¡ããã2çªç®ã®ã±ãŒã¹ã§ã¯ãå·ŠåŽã®ã¢ã¯ã·ã§ã³ãåã«ãµã€ã¬ã³ãã«å®è¡ããããã®åŸå³åŽã®ã¢ã¯ã·ã§ã³ãå®è¡ãããŸãã
ãã®å Žåã
getArgs
é¢æ°ã§å®çŸ©ãããã¢ã¯ã·ã§ã³ãå®è¡ãããšãã¢ããªã±ãŒã·ã§ã³åŒæ°æååã®ãªã¹ããå®è¡ãããããã
launch
é¢æ°ã«æž¡ãããŸãã èµ·åæ©èœã«ã€ããŠä»¥äžã«èª¬æããŸãã åŒæ°ãšããŠæååã®ãªã¹ããåãåããŸãããå€ãè¿ããªãI / Oã¢ã¯ã·ã§ã³ãè¿ããŸãã æ¢ã«è¿°ã¹ãããã«ãHaskellã®é¢æ°ã¯æ¹çšåŒã®ã·ã¹ãã ã«ãã£ãŠèšè¿°ãããããã¯èµ·åã®å®çŸ©ã§èŠèŠçã«æ瀺ãããŸãã
åæ çãªäœè«ã ç¹å®ã®é¢æ°åŒã³åºãããšã«ã©ã®åŒãéžæããããã¯ããã¿ãŒã³ãããã³ã°æé ãã€ãŸããã¿ãŒã³ãããã³ã°ã«ãã£ãŠæ±ºãŸããŸãã é¢æ°ãã³ãã¬ãŒãã¯ãå·ŠåŽã§å®çŸ©ãããæ¹çšåŒã®äžéšã«ãã£ãŠå®çŸ©ãããŸãã ãã¿ãŒã³ãããã³ã°æé ã¯ãã³ãŒãã«è¡šç€ºãããé åºã§ã³ã³ãããŒã«ãéžæããŸãã ãäœã§ããã®æ®éçãªãã³ãã¬ãŒãã¯ã·ã³ãã«
_
ã§ãã ãã³ãã¬ãŒãã§ã¯ãããŸããŸãªããŒã¿æ§é ãå解ã§ããŸãïŒããšãã°ãããããå¿ èŠããããŸãïŒãããšãã°ã
foo ["a",""] = 0
ãšæžããšãé¢æ°fooã«2è¡ "a"ãš "b"ã®ãªã¹ããæ¥ããšã 0ãè¿ããŸãã
ãããã£ãŠã
launch
é¢æ°ã«åäžã®å€
x
ãªã¹ããä»å±ããŠããå Žåãããã¯ãã£ã¬ã¯ããªãžã®ãã¹ã§ãããšèãããã®
èªäœã«çããåŒæ°ã䜿çšããŠManagerã¢ãžã¥ãŒã«ãã
processDirectory
é¢æ°ãåŒã³åºããŸãïŒé¢æ°ãã©ã®ã¢ãžã¥ãŒã«ããæ瀺çã«ç€ºãå¿ èŠã¯ãªãããšã«æ³šæããŠãã ãããããäºéã®è§£éãäžããªãå Žåãã€ãŸãã2ã€ã®ã¢ãžã¥ãŒã«ã«åãååã®é¢æ°ããããŸãïŒã ãããŠãäœãä»ã®ãã®ïŒ
_
ãã³ãã¬ãŒãã«æ³šæãæãïŒ
_
ãå®è¡ããŸãã
ãããã¡ã€ã³ã¢ãžã¥ãŒã«å šäœã§ãïŒ ããã°ã©ã ã®æ©èœ1ãå®è£ ããŸããããããéå§ããŸããïŒ
ã¯ããç§ã¯ãããã©ãã ãã²ã©ãæªéå§ãæ¢ããŠãããç解ããŠããŸãããä»ã¯ãœãŒã¹ã¢ãžã¥ãŒã«MainãããäžåºŠèŠãŠãã ããã ãã¹ãŠã®åæ çãªäœè«ãããäžåºŠèªãã§ãèªåã«èšãèãããŠãã ãããããã¯ãšãŠãé£ããã§ããïŒ ãã¶ãç°åžžãªã®ã§ããããïŒ ãã¹ãŠã®ãã¹ãã«åæ¢ãã€ã¹ãã€ãã¯ã«åæ Œãã人ã®ããã«ãèªã¿ç¶ããããšãææ¡ããŸãã
EXIFããŒã¿
ããã§ã¯ã¡ã€ã³ã®èšç®ããã»ã¹ãçµäºããEXIFããåçã®æéããŒã¿ãæœåºããæ©èœãèšè¿°ããŸãããã ãã®ããã«ãå¥ã®Photoã¢ãžã¥ãŒã«ãäœæãããŸããã ãªãåé¢ããã®ã§ããïŒ ããã¯ç§ã®æ¬èœã«ãã£ãŠç§ã«æ瀺ãããã®ã§ãããã¯åçãæ±ãããã®ã¢ãžã¥ãŒã«ã§ãããšæ³å®ãããŠããŸããçªç¶ç§ã®ãœãããŠã§ã¢ã¯è¿œå æ©èœã§æé·ããŸããïŒ ãã®ãœãŒã¹ãèŠãŠã¿ãŸãããã
*ãã®ãœãŒã¹ã³ãŒãã¯ã ãœãŒã¹ã³ãŒããã€ã©ã€ã¿ãŒã§åŒ·èª¿è¡šç€ºãããŸããã
- ã¢ãžã¥ãŒã«åçïŒ
- getTime
- ïŒ ããã§
- ã€ã³ããŒãããŒã¿ ã æé
- System.Localeã®ã€ã³ããŒã
- Graphics.Exifãã€ã³ããŒããã
- getTime :: String-> IOïŒãã¶ãæ¥ ïŒ
- getTime filePath =
- fromFile filePath >> =ïŒ\ e-> getTag e "DateTime"ïŒ>> =ïŒreturnãparseDateTimeïŒ
- ã©ãã§
- parseDateTimeïŒã¡ããã©strïŒ= parseTime defaultTimeLocale "ïŒ YïŒïŒ mïŒïŒ dïŒ HïŒïŒ MïŒïŒ S" str
- parseDateTime Nothing = Nothing
æã ãŸã£ãããããŸããã ä»åã¯ã¢ãžã¥ãŒã«å®çŸ©ã§ãæ¬åŒ§å ã«getTimeé¢æ°ã®ååãæå®ããããšã«æ³šæããŠãã ããã ã¢ãžã¥ãŒã«ã®å€éšããã¢ã¯ã»ã¹ã§ããæ©èœã¯ããã«ç€ºãããŠããŸãã C \ C ++ã®ãã©ãã·ã¥ããããŒãã¡ã€ã«ã®ä»£ããã«ãã·ã³ãã«ã§ãšã¬ã¬ã³ããªãœãªã¥ãŒã·ã§ã³ã玹ä»ããŸãã
getTimeé¢æ°ã«æ³šæããŠãã ããã åŒæ°ãšããŠãã¡ã€ã«ãã¹ãåãã Dayã«ãªãå¯èœæ§ã®ããã¢ã¯ã·ã§ã³ãè¿ããŸãã å€åããã¯äœããã®ããŒã¯ãŒãã§ã¯ãªãã2ã€ã®å€ãåãããšãã§ããéåžžã«æ確ãªã¿ã€ãã§ãïŒJust SomethingãŸãã¯Nothingã çµæãšããŠãé¢æ°ãå€ã®ç¯å²ããç¹å®ã®å€ãè¿ããªãå Žåããã®ããŒã¿åã䜿çšãããŸãã ããšãã°ãæå®ãããæ¡ä»¶ã«äžèŽãããªã¹ãå ã®ã¢ã€ãã ãæ€çŽ¢ããŸãã ãã®ãããªèŠçŽ ã¯ããã§ã¯ãªããããããŸããã
ããã§ãMaybeã®ååšã¯ããã®ãã¡ã€ã«ã«æéããŒã¿ããªãå¯èœæ§ãããããšã瀺ããŠããŸãã æ¥ã¯ãHaskellã®æéãè¡šãããŒã¿ã®äžçš®ã§ãã getTimeé¢æ°ã®å®çŸ©ïŒã€ãŸããæ¹çšåŒã®å³åŽïŒã¯ãç§ãã¡ã«ãšã£ãŠæ°ããæŠå¿µãããã«2ã€çŽ¹ä»ããŸãã ãããããŸãæåã«ã getTimeã¯3ã€ã®ã¢ã¯ã·ã§ã³ã§æ§æãããŠããããšãããããŸãã
- ãŸããGraphics.Exifã¢ãžã¥ãŒã«ã®fromFileé¢æ°ãExifåã®ãªããžã§ã¯ããèªã¿åãã察å¿ããã¢ã¯ã·ã§ã³ãå®è¡ãããšãã®ãªããžã§ã¯ããæäŸããã次ã®é¢æ°åŒã³åºãã«æž¡ãããŸãã
- 次ã®é¢æ°ã¯ã©ã ãåŒã§ã
\ e -> getTag e "DateTime"
ãããã§ããã¯ã¹ã©ãã·ã¥ã¯ã®ãªã·ã£èªã®ã·ã³ãã« "lambda"ã«åŸ®åŠã«äŒŒãŠããŸããããã¯1ã€ã®åŒæ°ã®é¢æ°ã§ã以åã«åãåã£ãExifãåãåãã Exifããã³ã¿ã°åãåãå ¥ããgetTagé¢æ°ã - åã®ã¢ã¯ã·ã§ã³ã®çµæã¯æçµæ§é ã«è»¢éãããŸãã詳现ã説æããŸãã
ãŸããæããŠç©è°ãéžãèšèãæ»ã£ãŠããŸãã å®éãHaskellã«æ»ã£ãŠãäœãè¿ããããé¢æ°ã®å®çŸ©ãéåžžã«éæ¥çã«åç §ããŸãã returnã¯ãæž¡ãããå€ãactionã«å€æããåçŽãªé¢æ°ã§ãã å®éã«ã¯ãå®è¡ãã¢ã¯ã·ã§ã³ã®ãã§ãŒã³ã®å®è¡ã§ããé¢æ°ã¯ããçŽç²ãªãå€ãè¿ãããšãã§ããŸããã ãã®ã¹ããªã³ã°ãååŸããããšã¯ç¹å®ã®ã¢ã¯ã·ã§ã³ãã§ãŒã³ãå®è¡ããããšã«ãã£ãŠã®ã¿å¯èœã§ããããããåãªãã¹ããªã³ã°ããè¿ãããšã¯ã§ããŸãããã€ãŸãããã®ã¹ããªã³ã°èªäœãååŸããããšã¯ã¢ã¯ã·ã§ã³ã§ããããããçµæã®å€ãã¢ããã«ã©ããããå¿ èŠããããŸãã ãè¿åãïŒè¿åïŒãåãåã£ãå Žæã«ã ããã¯ã¢ããããååŸããããã®ã§ããããã¢ããã«è¿ãïŒã©ããããïŒå¿ èŠããããŸãã æ»ãå€ã«é¢ããŠïŒã¢ããé¢æ°ã¯ããã®äžã§å®çŸ©ãããæåŸã®ã¢ã¯ã·ã§ã³ãã€ãŸã ãã®å Žåããã æ»ããŸãã
第äºã«ããããèšå·ã¯æ©èœã®çµã¿åããã§ãã
fy = z; gx = y;
fy = z; gx = y;
ãããã
(f . g) x == f( gx ) == z
ã 2çªç®ã®ã¢ã¯ã·ã§ã³ã®çµæãšããŠãæ¥ä»ãæã€æååãååŸããé¢æ°èªäœãDayãè¿ãå ŽåããããŸã ã ãããã£ãŠããã®æååãæåã«parsimã«ããããšãã§ããŸãããã®çµæãæããã«ãæ¥ä»ãããå¯èœæ§ãããããšãå€æãããããè¿ããŸãã å®éãæåŸã®ã¢ã¯ã·ã§ã³ã¯æ¬¡ã®ããã«èšè¿°ã§ããŸãã
\ str -> return (parseDateTime str)
æåŸã«ãwhereãããã¯ãgetTimeã®å®çŸ©ã§äœ¿çšããparseDateTimeã説æããŸãã whereãããã¯ã¯ãããšãã°ã³ã³ããã¹ãé¢æ°ãå®çŸ©ããŸãã ãããã®ç¯å²ã¯ããã®ãããã¯ãçºçããç¹å®ã®å®çŸ©ã«ãã£ãŠå¶éãããŸãã ãããã®ã³ã³ããã¹ãé¢æ°ã§ã¯ã芪é¢æ°ã®å ¥ååŒæ°ã«ã¢ã¯ã»ã¹ã§ããŸãããã¢ã¯ã»ã¹ããå¿ èŠããããŸãã ãã®å Žåããã®ãããªã³ã³ããã¹ãã®é¢æ°ã¯ãå€ã解æããé¢æ°ã§ãã Just and Nothingã䜿çšããŠã2ã€ã®ãã³ãã¬ãŒãã®2ã€ã®åŒã§è¡šçŸããå¿ èŠãããããïŒå¥ã®æ¹æ³ã§ã¯ããã®å®çŸ©ãgetTimeã®å®çŸ©ã«çŽæ¥ä»£å ¥ããããšãå¯èœïŒãå¥ã®ãããã¯ã«é 眮ããŸãã æåã®ã±ãŒã¹ã§ã¯å€ã解æãã2çªç®ã®ã±ãŒã¹ã§ã¯åã³Nothingãè¿ããŸãã åæããŸããã¯ã£ãããšïŒ
æéæœåºæ©èœã¯çµäºããŸããã ãã£ã¬ã¯ããªããã€ãã¹ã§ããŸãã
æ©èœ2-ãã£ã¬ã¯ããªãã©ããŒãµã«
åæ çãªäœè«ã Haskellã¯ãåœä»€åèšèªã®åé¡è§£æ±ºã«æ £ããŠããæ¹æ³ã§ã¯ãªããå°ãéã£ãèãæ¹ããããŸãã ããšãã°ããã¡ã€ã«ããããã£ã¬ã¯ããªãå·¡åããå ŽåãCããã°ã©ããŒã¯æ¬¡ã®ããã«èšããŸãããã«ãŒãã§ãã¡ã€ã«ã調ã¹ãŠAããã§ãã¯ããBãå®è¡ããŸããã ãã ããé¢æ°åèšèªã®ããã°ã©ããŒã¯ãããã£ã¬ã¯ããªå ã®åãã¡ã€ã«ã«åŠçæ©èœãé©çšããŸãããšèšããŸãã
ããªãã®æèãå°ãåæ§ç¯ãããšã倱ããããµã€ã¯ã«ãåŸæããã®ããããŸãã é¢æ°åèšèªã§ã¯ããããã¯ç³ã¿èŸŒã¿ãšãããããã«ãã£ãŠæ£åžžã«çœ®ãæããããŸãã ããã§ã¯ç³ã¿èŸŒã¿ã¯å¿ èŠãããŸããã説æã«ç ©ããããããšã¯ãããŸããã ãããæ©èœã«ã€ããŠèª¬æããŸãã æå³ã§æãè¿ããã·ã¢èªã¯ããããã³ã°ãã§ãããããã¯å®éã«ããã§ãã mapé¢æ°ã¯ãããããŒã¿ã»ãããå¥ã®ããŒã¿ã»ããã«ãããããŸãã å ¥åãšããŠãã¿ã€ãaã®èŠçŽ ã®ãªã¹ããã¿ã€ãa-> bã®é¢æ°ïŒãããŠãã©ã®ããã«é¢æ°åèšèªã§ããããããã§é¢æ°ãåŒæ°ãšããŠæž¡ãããšãã§ããŸãïŒïŒãåãåããæåŸã«ã¿ã€ãbã®ãªã¹ããååŸããŸãã ãããé¢æ°ã®ã¿ã€ãã¯æ¬¡ã®ãšããã§ãã
map :: (a -> b) -> [a] -> [b]
æåã®åŒæ°ã®æ¬åŒ§ã«æ³šæããŠãã ããã2çªç®ã®åŒæ°ã¯é¢æ°ãã®ãã®ã§ãããšå ±åãããŸãã äžè¬çã«ãHaskellã§ã¯ããã¹ãŠã®é¢æ°ã¯å®éã«ã¯åäžã®åŒæ°ã®é¢æ°ã§ãããçµæãšããŠããããã®ããã€ãã¯å€ã§ã¯ãªãé¢æ°ãè¿ããŸãã è¿œå æ©èœãæ€èšããŠãã ããã
add :: Int -> Int -> Int
ãã®ã¿ã€ãã¯ã次ã®ããã«æ£ããèšè¿°ããå¿ èŠããããŸãã
add :: (Int -> (Int -> Int))
éããæããŸããïŒ ãããã£ãŠã
add 5 2
ã¯å€7ãè¿ããŸãããã ãã
add 5
ãIntåã®å€ãåããIntåã®å€ãè¿ãé¢æ°ãè¿ããŸãã ãã®ãããªå¥è·¡ã«åºã¥ããŠããããæ©èœã䜿çšããåçãæ§ç¯ãããŠããŸãã ããã¯ãå ã®ãªã¹ãã®ãã¹ãŠã®èŠçŽ ã«1ãè¿œå ããæ¹æ³ã§ãã
map (+ 1) [1,2,3]
ããããHaskellã®ãã¥ãŒããªã¢ã«ã§åæ§ã®äŸãèŠã€ããããšãã§ããŸãã çŸã«æ»ããŸãããã ã«ã¿ãã°å ã®èŠçŽ ã®ãªã¹ãå šäœã§ãå®å šã«åäžã®ã¢ã¯ã·ã§ã³ãå®è¡ãããããã®ã¢ã¯ã·ã§ã³ã®çµæã®ãªã¹ããååŸããå¿ èŠãããããšãæããã«ãªããŸããïŒå®éãããã¯å°ãééã£ãŠããŸãããåé¡ã§ã¯ãããŸããïŒã æããŸããïŒ ããã¯ããããã®é©çšãèŠæ±ãããå Žæã§ãã ãã ããæåã«ãã«ã¿ãã°ã®åèŠçŽ ã§äœãè¡ãå¿ èŠãããããå€æããŸãã
- ãŸãããã®ãã£ã¬ã¯ããªãŸãã¯ãã¡ã€ã«ãç¥ãå¿ èŠããããŸãã
- 次ã«ãããããã£ã¬ã¯ããªã§ããå Žåã¯ãå éšã«ç§»åããŸãã ãã£ã¬ã¯ããªåŠçæ©èœãå床åŒã³åºããŸãã
- æåŸã«ã3çªç®ã«ããã¡ã€ã«ã®å Žåã¯ãEXIFããŒã¿ããæå»ãæœåºããå¿ èŠããããŸãããã®å Žåã¯ãé©åãªå Žæã«ã³ããŒããŸãã
次ã«ãå ã®ã³ãŒãã®äžéšãæå³çã«åé€ãïŒãŸãã¯ãæ¬äŒŒã³ãŒãããã©ã°ã«çœ®ãæããŠïŒãæãéèŠãªã³ãŒãã®ã¿ãæ®ããŸãã ãããçç¥ããªããããã®ã¬ã³ãŒãããã£ã¬ã¯ããªã§ãããã©ããã«ã€ããŠäœããã®æ å ±ãèŠã€ãããšæ³åããŠãã ããã 次ã«ã次ã®åŠçæ©èœãæ€èšããŸãã
*ãã®ãœãŒã¹ã³ãŒãã¯ã ãœãŒã¹ã³ãŒããã€ã©ã€ã¿ãŒã§åŒ·èª¿è¡šç€ºãããŸããã
- -èŠçŽ ã®åŠçïŒã«ã¿ãã°ã®å Žå-ååž°ãå ¥åããã以å€ã®å Žåã¯åçãåŠçããŸã
- processSingle ::ïŒ String ãBoolïŒ-> IOïŒïŒ
- processSingleïŒpathãTrueïŒ= processDirectoryãã¹
- processSingleïŒãã¹ãFalseïŒ= do
- picturesDir <-getPicturesDir
- maybeDate <-getTimeãã¹
- copyPhoto picturesDir maybeDate
- ã©ãã§
- -å®å šãªã³ããŒ
- copyPhoto pictures Nothing = return ïŒïŒ
- copyPhoto picturesïŒæ¥ä»ã®ã¿ïŒ= do
- let NewPath = pictures ++ "/" ++ïŒformatTime defaultTimeLocale "ïŒ Y /ïŒ B /ïŒ d"æ¥ä»ïŒ
- copyFileãã¹newPath
ããã§ãé¢æ°processSingleãååŸããŸããã åŒæ°ãšããŠã2ã€ã®èŠçŽ ã®ã¿ãã«ïŒã€ãŸããå€ã®ãã¢ïŒãåããŸãïŒãã¡ã€ã«ã·ã¹ãã èŠçŽ ãžã®ãã¹ãšãããããã£ã¬ã¯ããªã§ããããšã®ãµã€ã³ã ãã¿ãŒã³ãããã³ã°ã䜿çšããŠãé¢æ°ã2ã€ã®æ¹çšåŒã«åå²ããŸããã1ã€ç®ã¯ãã£ã¬ã¯ããªçšã2ã€ç®ã¯ååž°çšã2ã€ç®ã¯ãã¡ã€ã«çšã§ãã ããã§ã¯ãã¢ã¯ã·ã§ã³ã®èšæ³ã«ã€ããŠæåã«çŽ¹ä»ããŸãã
åæ çãªäœè«ã ãã®ç¬éãŸã§ãç¹å¥ãªã¢ã€ã³ã³ã§åºåãããäžé£ã®ã¢ã¯ã·ã§ã³ãã次ã ã«ãèšé²ããŸããã ããã¯ãããšãã°ãã¢ã¯ã·ã§ã³ããæœåºãããå€ã®ãã³ãã¬ãŒããšããªã³ã¶ãã©ã€ãã§æ¯èŒããå¿ èŠãããå Žåãªã©ãå¿ ããã䟿å©ã§ã¯ãããŸããã ãŸãã¯ãããé »ç¹ã«èµ·ããããšãšããŠã2ã€ã®ã¢ã¯ã·ã§ã³ãå®è¡ãããããã®çµæã3çªç®ã®é¢æ°ã«è»¢éããå¿ èŠããããŸãã ããã§ãdo-notationãå©ãã«ãªããŸããããã¯ãå®éã«ã¯åå¿è ã®ç®ã«åªããã§ãã 以äžã«2ã€ã®åçã®ã³ãŒãã瀺ããŸãã
*ãã®ãœãŒã¹ã³ãŒãã¯ã ãœãŒã¹ã³ãŒããã€ã©ã€ã¿ãŒã§åŒ·èª¿è¡šç€ºãããŸããã
- foobââar = action1 >> = action2 >> = action3
- foobââar '= do
- result1 <-action1
- result2 <-action2 result1
- action3 result2
ãã®å Žåã2ã€ã®ç°ãªãã¢ã¯ã·ã§ã³ã®2ã€ã®çµæã®ã¿ãã3çªç®ã®é¢æ°ã®åŒæ°ãšããŠäœ¿çšãããŸãã ã³ããŒæ©èœã¯ç°¡åã§ããæ¥ä»ãèŠã€ãã£ããããã³ãã¬ãŒãã§ååºŠç §åãããã¡ã€ã«ã
path
ãã
newPath
ã³ããŒããŸãã 2ã€ã®æ©èœã«æ³šæããŠãã ããã
- pathã¯ããæäžäœãã®processSingleé¢æ°ã®åŒæ°ã§ãã copyPhotoã¯ç¶æ³äŸåæ©èœã§ãã
- letã¯èšèªã®ããŒã¯ãŒãã§ãããç¹å®ã®å€ãç¹å®ã®ååã«ãã€ã³ãã§ããŸãïŒããã¯å²ãåœãŠã§ã¯ãªãããšã«æ³šæããŠãã ãããå€ã¯å€æŽã§ããŸãããããã®ååã¯å¥ã®å€ã«ãã€ã³ãã§ããŸãããåã«äœããã®é¢æ°ã«æž¡ããå Žåãããããããã§ã¯å€æŽãããŸããïŒ-ãã®å ŽåãåçŽã«é©çšãããŸãã
formatTime
ã¯ãæããã«ããã±ãŒã«ããã¿ãŒã³ãããã³æ¥ä»ãåãåãããã®ãã¿ãŒã³çšã«ãã©ãŒããããããæ¥ä»ã®æååãè¿ãé¢æ°ã§ãã
++
ã¯ãªã¹ãé£çµé¢æ°ã§ãã
çªç¶ãé¢æ°ïŒ3ã«ã€ããŠèª¬æããŸããã æ¬åœã«ç°¡åã§ããïŒ ãããã£ãŠãé¢æ°çªå·2ã¯ã©ã®ããã«ãªããŸããã 次ã®ããã«ãªããŸãã
*ãã®ãœãŒã¹ã³ãŒãã¯ã ãœãŒã¹ã³ãŒããã€ã©ã€ã¿ãŒã§åŒ·èª¿è¡šç€ºãããŸããã
- processDirectory :: æåå -> IOïŒïŒ
- processDirectory dir =
- getDirectoryContents dir >> = checkItems >> =ïŒmapM_ processSingleïŒ
- ã©ãã§
- -ãã£ã¬ã¯ããªã®å 容ã®ç¹å®ã®ãªã¹ãã«ã€ããŠãåèŠçŽ ã®ããŒã«ãŒããã£ã¬ã¯ããªããå«ãã¿ãã«ãè¿ããŸã
- checkItems xs = mapM singleCheck xs
- ã©ãã§
- singleCheck path = do
- isDirectory <-ïŒdoesDirectoryExistãã¹ïŒ
- return ïŒãã¹ãisDirectoryïŒ
ãããããèŠãŠãã ãããå®éãããã¯éåžžã«åçŽãªé¢æ°ã§ããããããæåã«ãmapMãšmapM_ã«ã€ããŠå°ã説æããŸãã
åæ çãªäœè«ãäžèšã§èª¬æããmapé¢æ°ã¯ãã¯ãªãŒã³ãªã³ãŒãã§ã®ã¿æ©èœããŸããã³ãŒãã¯ã¢ããã§ãã®ã§ãã¢ãããããã䜿çšããå¿ èŠããããŸãããããã®é¢æ°ã®ã¿ã€ããèæ ®ããŠãã ããã
mapM :: (a -> IO b) -> [a] -> IO [b]
mapM_ :: (a -> IO b) -> [a] -> IO ()
ãããã¯çŽç²ãªããããšãŸã£ããåãæå³ãæã¡ãŸãããåºåã§ã¯çŽç²ãªå€ã§ã¯ãªãããããã®å€ãè¿ãã¢ã¯ã·ã§ã³ãæäŸããŸããæåã®ã±ãŒã¹ã§ã¯ãç¹å®ã®åå€ãåŠçããçµæã«é¢å¿ããããåŠçãããå€ã®ãªã¹ããçæããã¢ã¯ã·ã§ã³ãååŸããŸãã2çªç®ã®ã±ãŒã¹ã§ã¯ãåŠçã®çµæã«é¢å¿ããªããã¢ã¯ã·ã§ã³ãå®äºããå¿ èŠããããŸãã
ãããã£ãŠãã³ãŒããäžããäžã«èªã¿ãŸãã
- singleChecké¢æ°ã¯ããã£ã¬ã¯ããªãæå®ããããã¹ã«ãããã©ããã確èªãããã¹ãšããŒã«ãŒã®ãã¢ãè¿ãé¢æ°ã§ãïŒããã¯äžèšã§åŠçããæ§é ã§ãïŒïŒã
- checkItemsé¢æ°ã¯ãã¡ã€ã«ã®ãªã¹ãïŒãã¡ã€ã«ãžã®ãã¹ïŒãåãåããå®è¡æã«ãã¹ãšããŒã«ãŒã®ãã¢ã®ãªã¹ããæäŸããã¢ã¯ã·ã§ã³ãè¿ããŸãïŒããã§ã¯ã¢ã¯ã·ã§ã³ã®çµæããããã£ãŠmapMã«é¢å¿ããããŸãïŒã
- æåŸã«ãprocessDirectoryé¢æ°ã¯ãã¡ã€ã«ã®ãªã¹ããåãåãããããã®ããããã«ããŒã«ãŒãèšå®ããŠãããäžèšã§å®çŸ©ãããprocessSingleé¢æ°ã«åŸã£ãŠåãåã£ãåãã¢ãåŠçããŸãïŒããã§ã¯ãåŠçèªäœã¯éèŠãªãã®ãäœãè¿ãããã¢ã¯ã·ã§ã³ã®çµæã«é¢å¿ããªããå®è¡ããã ãã§ãïŒã
ãããŠããã ãã§ãïŒãããïŒããã°ã©ã ã®æºåãã§ããŸãããæåŸã®éšåã®åã«ãGUIã«ã€ããŠå°ã説æããããšæããŸãã
宣èšåèšèªã®GUI
宣èšåèšèªãšåœä»€åèšèªã®éãã¯äœã§ããïŒåœä»€åèšèªã§ã¯ãèšç®ãè¡ãæ¹æ³ãèšè¿°ããå¿ èŠãããã宣èšåèšèªã§ã¯ãåãåããããã®ãèšè¿°ããå¿ èŠããããŸãã宣èšåèšèªã®æãæ確ãªäŸã¯SQLã§ããããã§ãã°ã©ãã£ã«ã«ã€ã³ã¿ãŒãã§ã€ã¹ã«ã€ããŠå°ãèããŠã¿ãŸããããå®éãïŒç¹å®ã®ããŒã«ãããã®èŠåã«åŸã£ãŠïŒå®£èšçã«è¡šç€ºããå¿ èŠããããã®ãèšè¿°ãããªããžã§ã¯ããšå¯Ÿè©±ãããšãã«ãªããžã§ã¯ãããã¹ãããšãããã«èšè¿°ããå¿ èŠããããŸãã
Haskellã«æ»ããŸããã-æ©èœçãªå®£èšåèšèªãšããŠããã®æ§é ã«çŽ æŽãããé 眮ãããŠããŸããããšãã°ããã¿ã³ã¯ãªãã¯ãã³ãã©ãŒãäœæããã«ã¯ãåŒæ°ãšããŠãã³ãã©ãŒé¢æ°ãæž¡ãã ãã§ååã§ãããããŠããã¯ãšãŠãèªç¶ã§ããHaskellã§ã€ã³ã¿ãŒãã§ãŒã¹ãäœæããã«ã¯ãGTKã䜿çšããŸããããã¯æ¬¡ã®ããã«è¡ãããŸãïŒGladeã§ãã©ãŒã ãæç»ããHaskellã³ãŒãã§ãã³ãã©ãŒãé 眮ããŸãã
ã¿ã¹ã¯ã®ç°¡ç¥åãããã³ãŒãã¯æ¬¡ã®ãšããã§ãã
*ãã®ãœãŒã¹ã³ãŒãã¯ã ãœãŒã¹ã³ãŒããã€ã©ã€ã¿ãŒã§åŒ·èª¿è¡šç€ºãããŸããã
- prepareGUI mainWindow startButton fileChooser =
- ãã
- onDestroy mainWindow mainQuit
- onClicked startButtonïŒprocessClick fileChooserïŒ
- ã©ãã§
- processClick fileChooser = fileChooserGetFilename fileChooser >> = processDirectory
圌ã¯ã³ã¡ã³ããå¿ èŠãšããªããšæãã
ãããã«
ãããžã§ã¯ãã®å®å šãªãœãŒã¹ãgithubïŒäžã®ãªã³ã¯ïŒã«æçš¿ããŸãããèå³ã®ãã人ã¯çç¥ãåãããšããå§ãããŸããããªã詳现ãªã³ã¡ã³ããæäŸããŸãããçµæãšããŠåŸãããèšäºã®å°è±¡çãªéã«ãããããããç§ã¯ããã泚ææ·±ãèªãã 人ãããªãã®Haskellãããã»ã©è€éã§ã¯ãªããã»ãã®å°ãç°ãªãããšãç解ãããšä¿¡ããŠããŸããããã¯ä»ã®ååã«åºã¥ããŠããŸããããããã®åºç€ã«åºã¥ããŠããããã·ã¹ãã ãŸãã¯ã¢ããªã±ãŒã·ã§ã³ã®ããã°ã©ãã³ã°ã§ãããã©ããã«ããããããä»»æã®ã¬ãã«ã§ã³ãŒããæžãããšã¯ããªãå¯èœã§ããããã«å ãžé²ãããšãã§ããŸãïŒå°ãã®éãHaskellã«åºã¥ããŠçŽ æŽãããMVC Webãã¬ãŒã ã¯ãŒã¯ãçãŸããããšãæ³åããŠãã ããïŒãã®ãã¥ãŒããªã¢ã«ã§ã¯ãæ°·å±±ã®äžè§ã«è§Šããã ãã§ãå®éã«ã¯ãŸã åŠã¶ã¹ãããšããããŸã-ããªã¢ãŒãã£ãºã ãåã¯ã©ã¹ã䞊ååŠçïŒ..ãã®èšäºãèªãã 人ããå°ãªããšããã®çŸããèšèªãåŠã³ãããšãã欲æ±ãåŒã³èµ·ãããããšãé¡ã£ãŠããŸãã
Githubãããžã§ã¯ã
Haskell