Haskellãããã£ãŠïŒãåããšã颿°ãã®åºæ¬ã解説ïŒã第äºèšèªãšããŠã®Haskellã
第äºèšèªãšããŠHaskellãåŠã¶éæ¡å ãéçºç°å¢ã®æºåãããHaskellãããããã°ã©ãã³ã°ã®èãæ¹ãŸã§ãHaskell-jpã®igrepãããäžå¯§ã«è§£èª¬ããŸãã
ããã«ã¡ã¯ãHaskell-jpã®å±±æ¬æ æ»ã§ãã
ãã®èšäºã§ã¯ããã§ã«ããã°ã©ãã³ã°çµéšã®ããæ¹åãã«ã第äºèšèªãšããŠHaskellãåŠã¶éæ¡å
ãããŠãããŸãã
ç°å¢ã®æºåããèªæãªãµã³ãã«ããã°ã©ã ã®ç޹ä»ã«ãšã©ãŸãããHaskellãããããã°ã©ãã³ã°ã®èãæ¹ãäŒããŠããäºå®ã§ãã
Haskellã«ã€ããŠ
Haskellãšãããšãã颿°åããšããããŒã¯ãŒããæãæµ®ãã¶æ¹ãå€ããšæããŸãã 確ãã«Haskellã¯ããã¹ãŠã®é¢æ°ãã«ãªãŒåãããŠãããããããçµã¿åãããŠããã°ã©ã ãæžããŠãã颿°ããã°ã©ãã³ã°ãããããèšèªã§ãã ãããHaskellã¯ã颿°åèšèªã§ãããšåæã«ãå³å¯ãã€æè»ãªåã·ã¹ãã ãæã€éçåä»ãèšèªã§ããããŸãã ããã«ããã®åŒ·åãªåã«ãã£ãŠããã°ã©ã ã®å¯äœçšãŸã§ã管çã§ããä»çµã¿ãåããŠããŸãã ãããã®ç¹åŸŽãããã°ãå°ãªãå ç¢ã§ã¡ã³ããã³ã¹æ§ã®é«ããœãããŠã§ã¢äœãã«æŽ»çšã§ããã®ããHaskellãšããããã°ã©ãã³ã°èšèªã ãšãããã§ãããã
å®éãHaskellã¯ãä¿¡é Œæ§ãšã¹ããŒããæ±ããããè€éãªã·ã¹ãã ããããžã§ã¯ãã§æ°å€ãæ¡çšãããŠããŸãã Facebookã«ãããã·ã¹ãã æªçšå¯Ÿçã®åºç€ã§ããSigmaãã ææ¥ãããã®èªèšŒãµãŒããŒã¯ããããªãã«å€§ããªèŠæš¡ã§ã®Haskellã®å®çšäŸãšããŠæåã§ãã Tsuru Capitalãã¯ãããéèæ¥çã§ãå©çšãããŠããŸãã Haskellã§ããã°ã©ã ãæžããŠãããšãããšããããäœã«äœ¿ããã®ããšèãããã®ã§ãããæ±çšããã°ã©ãã³ã°èšèªãªã®ã§ã ãããã®çšéã«ã¯å©çšã§ããã®ã§ãã
çŸåšãHaskellã§æžããããã°ã©ã ãå®è¡ãããšãã«ãã£ãšãããå©çšãããŠããã®ã¯ãGHCïŒGlasgow Haskell CompilerïŒãšããã³ã³ãã€ã©ã§ãã GHCã§ã¯ãæšæºã®Haskellãããã«äŸ¿å©ã«äœ¿ããããã«ãããŸããŸãªèšèªæ¡åŒµãæäŸãããŠããŸãã
- Haskellã«ã€ããŠ
- Haskellã®éçºç°å¢ãæŽåãã
- 詊ãã«äœ¿ã£ãŠã¿ãŸãããïŒHaskellã§é¢æ°ã®å®çŸ©ãšåŒã³åºãïŒ
- Haskellã®åºæ¬çãªåã«èŠªãããïŒGHCiããã£ãšäœ¿ãããªãã€ã€ïŒ
- åãã¢ããªã±ãŒã·ã§ã³ãäœã£ãŠã¿ãŸãããïŒGHCã䜿ã£ãå®è¡ãã¡ã€ã«ã®ãã«ãïŒ
- ããã¡ãã£ãšåã£ã颿°ãäœã£ãŠã¿ãŸãããïŒæ¬¡åäºåïŒ
Haskellã®éçºç°å¢ãæŽåãã
Haskellã®éçºç°å¢ãæŽåããæ¹æ³ã¯ããã€ããããŸãããä»åã¯åããŠç°å¢ãæ§ç¯ããæ¹ã«ãããããªããstackããšããããŒã«ã䜿çšããæ¹æ³ã玹ä»ããŸãã stackã®ã€ã³ã¹ããŒã«ãšèšå®æ¹æ³ã¯stackã®å ¬åŒãµã€ãã«äžéãèŒã£ãŠããŸãããè±èªãšããããšãããã®ã§ããã®èšäºã§ã説æããŠãããŸãã
LinuxãMacã§ã€ã³ã¹ããŒã«ãã
LinuxãMacã§stackãã€ã³ã¹ããŒã«ããæ¹æ³ã¯ç°¡åã§ãã äžèšã®ããã«curlã³ãã³ãã§ããŠã³ããŒãããã·ã§ã«ã¹ã¯ãªããããã®ãŸãŸå®è¡ããã°ã䜿çšããŠããOSãèªåã§æ€åºããŠãã€ã³ã¹ããŒã«ããŠãããŸãã
$ curl -sSL https://get.haskellstack.org/ | sh
Windowsã§ã€ã³ã¹ããŒã«ãã
Windowsã§stackãã€ã³ã¹ããŒã«ããå Žåãåºæ¬çã«ã¯åçŽã§ãå
¬åŒã®ããã¥ã¡ã³ãã®ãWindowsãã»ã¯ã·ã§ã³ã«çšæãããŠãããªã³ã¯ããé©åãªã€ã³ã¹ããŒã©ãŒãããŠã³ããŒãããå®è¡ããŸãããããŸããChocolateyãã䜿ãã®æ¹ã¯ãchoco install haskell-stackã§ãã€ã³ã¹ããŒã«ã§ããŸãã
Windowsã§stackãã€ã³ã¹ããŒã«ããå Žåã«ã¯ã次ã®ç¹ã«æ³šæããŠãã ããã
Windowsã®ãŠãŒã¶ãŒåãæ¥æ¬èªã«ãªã£ãŠãããšå€±æãã
WindowsãŠãŒã¶ãŒã®æ¹ãäžèšã®æé ã§stackãçšæããéãOSã®ãŠãŒã¶ãŒåãæ¥æ¬èªãšãªã£ãŠãããšãGHCã®ã€ã³ã¹ããŒã«æã«ãšã©ãŒã«ãªã£ãŠããŸãå Žåãããããã§ãã ç¹ã«Windows 8ãWindows 10ã§ã¯ããããšæ°ã¥ããªããã¡ã«ãŠãŒã¶ãŒåãæ¥æ¬èªã«ãªã£ãŠããŸã£ãŠããããšãå€ãã®ã§ã確èªããŠãããŸãããïŒçè ãé·å¹Žã®WindowsãŠãŒã¶ãŒã§ãããããŸããŸãã®åé¡ã«åºãããããšã¯ãããŸããã§ããïŒã
äžèšã®èšäºãªã©ãåèã«ãæ°ããWindowsã®ãŠãŒã¶ãŒãæ¥æ¬èªä»¥å€ã§äœãçŽããŠè©ŠããŠã¿ãã»ãããããããããŸããã
- [Windows10] OSã»ããã¢ããã§ãŠãŒã¶åãæ¥æ¬èªã«ããŠã¯ãããªãçç±
- éçºè ãSurfacePro3ãè²·ã£ãããŸãããããš by @tanakh on @Qiita
æ°ããWindowsã®ãŠãŒã¶ãŒãäœããããªãããšããå Žåã«ã¯ãç°å¢å€æ°LOCALAPPDATAã倿ŽããŠæ¥æ¬èªãå«ãŸãªããã¹ã«å€ãããšããæããããŸãã
stackã¯LOCALAPPDATAã«æžããããã£ã¬ã¯ããªãŒã®Programs\stack以äžã«ã€ã³ã¹ããŒã«ããGHCã眮ããŸããããã®LOCALAPPDATAã«æ¥æ¬èªã®ãã¹ãå«ãŸããŠãããšãšã©ãŒã«ãªãããã§ãã
LOCALAPPDATAã¯ãããã©ã«ãã§Windowsã®ãŠãŒã¶ãŒãã©ã«ããŒã®ãã¹ïŒã€ãŸã C:\Users\[ãŠãŒã¶ãŒå]ïŒããäžã«äœãããã®ã§ããŠãŒã¶ãŒåã«æ¥æ¬èªãå«ãŸããŠãããšåé¡ã«ãªããŸãã
ç°å¢å€æ°LOCALAPPDATAã倿Žããæ¥æ¬èªãå«ãŸãªããã¹ã«å€ããã°ããããã§ããã
LOCALAPPDATAã¯stackã®ã»ãã«ãããŸããŸãªã¢ããªã±ãŒã·ã§ã³ã䜿çšããŠãããã£ã¬ã¯ããªãŒãªã®ã§ã倿Žã®éã¯æ³šæãå¿
èŠã§ãã
圱é¿ãæå°éã«ãšã©ããããã«ãããããã¡ã€ã«ãäœããç°å¢å€æ°PATHã«ãããããåªå
床ã®é«ãäœçœ®ã«ãããã£ã¬ã¯ããªãŒã«çœ®ããŠã©ããããããšããæããããŸãã
以äžã¯ãLOCALAPPDATAãC:\foobarã«èšå®ããŠstackãå®è¡ããå Žåã®ãã©ããçšããããã¡ã€ã«ã®äŸã§ãã
@echo off set LOCALAPPDATA=C:\foobar [å®éã«stackãã€ã³ã¹ããŒã«ãããŠãããã¹]\stack %1 %2 %3 %4 %5 %6 %7 %8 %9
ãããstack.batãšããååã§ä¿åããŠãç°å¢å€æ°PATHã®å
é ã®ãã¹ã«é
眮ããã°ãstackã³ãã³ããå®è¡ãããšãã ãLOCALAPPDATAã倿Žããããšãã§ããŸãã
詊ãã«äœ¿ã£ãŠã¿ãŸãããïŒHaskellã§é¢æ°ã®å®çŸ©ãšåŒã³åºãïŒ
ãããŸã§ã®æ¹æ³ã§stackãã€ã³ã¹ããŒã«ã§ããããæ©éåãããŠã¿ãŸããããâŠâŠãšãã®åã«ãstackã䜿ã£ãŠHaskellã®æãæåãªã³ã³ãã€ã©ãŒãGHCãã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã
stackã¯ãããšãããªããRubyã®rbenvãPythonã®pyenvã®ããã«ãåŠçç³»ïŒHaskellã§ããã°GHCïŒã®ããŸããŸãªããŒãžã§ã³ãåé¢ããŠã€ã³ã¹ããŒã«ã§ããããã«ããããã®ãã®ã§ã {$annotation_1}ããªã®ã§æ¬åœã«Haskellã§ã®éçºãã§ããããã«ããããã«ã¯ãstack setupã³ãã³ããå©çšããŠãGHCãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã
ããæ¹ã¯ç°¡åã§ãäžèšã®ããã«stack setupã³ãã³ããå®è¡ããã ãã§ãã
$ stack setup
ãã°ããåŸ
ã€ãšãGHCã®ã€ã³ã¹ããŒã«ãå®äºããŸããå®äºãããã確èªã®ããã«GHCã®ããŒãžã§ã³ãèŠãŠã¿ãŸãããã
stackã§ã€ã³ã¹ããŒã«ããGHCãå©çšããã«ã¯ãstack ghcã³ãã³ãã䜿ããŸãã
$ stack ghc --version Invalid option `--version' Usage: stack.exe ghc [-- ARGS (e.g. stack ghc -- X.hs -o x)] ([--plain] | [--[no-]ghc-package-path] [--[no-]stack-exe] [--package ARG] [--rts-options RTSFLAG]) [--help] Run ghc
ãã£ãšãã--versionãšãããªãã·ã§ã³ã¯ç¡å¹ã ïŒInvalid optionïŒããšèšãããŠããŸããŸãããghcã«ã¯--versionãªãã·ã§ã³ãããã¯ããªã®ã§ãããããã¯ã©ãããããšã§ãããïŒ
ããã¯stackã®æ®å¿µãªä»æ§ã§ãstackã³ãã³ãçµç±ã§ghcã«--versionãªã©ã®ãªãã·ã§ã³ãæž¡ãããšããå Žåãæå³ã«åããŠstackã³ãã³ããïŒæ£ç¢ºã«ã¯ãstackã³ãã³ãã®ãµãã³ãã³ãã§ããstack ghcãïŒ--versionãªãã·ã§ã³ãè§£éããŠããŸãããšã«ãããšã©ãŒã§ãã
ãããåé¿ããã«ã¯ã--versionãªãã·ã§ã³ããåã«--ãæž¡ããŸãã
stackã³ãã³ãã--versionãªãã·ã§ã³ãè§£éããã®ããããããããã§ããããããŠå®è¡ããŠã¿ãŸãããã
$ stack ghc -- --version The Glorious Glasgow Haskell Compilation System, version 8.0.2
ã¡ãããšGHCã®ããŒãžã§ã³ãèŠããŸãããïŒ
ã--ãæž¡ãããšã§ãã以éã®åŒæ°ããªãã·ã§ã³ãšããŠè§£éãããªãããšãããã¯ããã¯ã¯ãstackã³ãã³ãã«éããããªãã·ã§ã³ãè§£éãã倧æµã®ã³ãã³ãã§äœ¿çšã§ããã®ã§ããã²èŠããŠãããŠãã ããã
ãªããäžèšã®éããä»åã¯å·çæç¹ã§stack setupããå Žåã«ããã©ã«ãã§ã€ã³ã¹ããŒã«ããããGHC 8.0.2ã䜿çšããŠèª¬æããŸãã
䜿çšããããŒãžã§ã³ã«ãã£ãŠè¡šç€ºãããå
容ãç°ãªãå ŽåããããŸããããããããäºæ¿ãã ããã
察話ç°å¢GHCiã䜿ã£ãŠã¿ãŸããã
ãããŸã§ã®æ¹æ³ã§GHCã®ã€ã³ã¹ããŒã«ã確èªã§ããããç¶ããŠGHCä»å±ã®å¯Ÿè©±ç°å¢ïŒREPLïŒã§ããGHCiã䜿çšããŠã¿ãŸãããã
次ã®ããã«stack ghciã³ãã³ããå®è¡ãããšèµ·åã§ããŸãïŒåºåçµæã¯ç°å¢ã«ãã£ãŠåŸ®åŠã«ç°ãªããŸãïŒã
$ stack ghci Configuring GHCi with the following packages: GHCi, version 8.0.2: http://www.haskell.org/ghc/ :? for help Loaded GHCi configuration from C:\Users\user\AppData\Local\Temp\ghci4628\ghci-script Prelude>
GHCiãèµ·åãããããšããããé»åã®ããã«äœ¿ã£ãŠã¿ãŸãããã
Prelude> 1 + 1 2 -- 身é·170cm, äœé60kgã®äººã®BMI Prelude> 60 / 1.70 ^ 2 -- 环ä¹ã«ã¯ãã£ã¬ããã^ãã䜿ããŸãã 20.761245674740486
ã¡ãããšèšç®ã§ããŸããã
ãªããã--ãã§å§ãŸãè¡ã¯Haskellã®ã³ã¡ã³ãã§ãããã®ããã«GHCiã®ãªãã§ã䜿ããŸãã
Haskellã§ã¯é¢æ°ãã€ã³ãŒã«ã§å®çŸ©ãã
ç¶ããŠãGHCiããHaskellã®ãœãŒã¹ãã¡ã€ã«ãèªãã§ã¿ãŸããããGHCiã§ã¯:lãšããã³ãã³ãïŒ:loadã®çç¥åœ¢ïŒã§ãåŒæ°ã«æž¡ããHaskellã®ãœãŒã¹ãã¡ã€ã«ãèªã¿ããã®åäœã確èªã§ããŸãïŒ:lã¯ãããŸã§ãGHCiå°çšã®ã³ãã³ãã§ãããHaskellã®ææ³ãšã¯é¢ä¿ããããŸããã念ã®ãããæ³šæãïŒã
以éããã®èšäºã§ã¯ãããŸãHaskellã®ãœãŒã¹ãã¡ã€ã«ãæžãã:lã³ãã³ãã§ãã®ãã¡ã€ã«ãèªãã§åäœã確èªããããšããæé ãç¹°ãè¿ãããšã§èª¬æãé²ããŠãããŸããããã§GHCiã«æ
£ããŠãããŸãããã
æå§ãã«ã身é·ïŒheightïŒãšäœéïŒweightïŒãåãåã£ãŠãè¥æºåºŠã衚ãBMIïŒBody Mass IndexïŒãè¿ã颿°ã§ãå®çŸ©ããŠã¿ãŸãããã
äžèšã®1è¡ãèšè¿°ãããã¡ã€ã«ãbmi.hsãšããååã§ä¿åããŠãã ããã
bmi height weight = weight / height ^ 2
ãã®1è¡ã§ãbmiãšãã颿°ãå®çŸ©ããŠããŸãã
ãã£ãããªã®ã§ãããã§Haskellã«ããã颿°å®çŸ©ã®ææ³ã解説ããŠãããŸãããã Haskellã§ã¯ã次ã®ãããªåœ¢åŒã§é¢æ°ãå®çŸ©ããŸãã
颿°å ä»®åŒæ°å1 ä»®åŒæ°å2 ... ä»®åŒæ°åN = ã颿°ã®æ¬äœã
å
ã»ã©ã®bmi颿°ã§ãããšãbmiã颿°åãheightãšweightãä»®åŒæ°åã§ãã
ãããŠãã€ã³ãŒã«ã=ãããåŸãã®ãweight / height ^ 2ãã®éšåãã颿°ã®æ¬äœãã«è©²åœããŸããä»®åŒæ°ã®weightãšheightã䜿ã£ãèšç®åŒã«ãªã£ãŠããããšãããããŸããã
ãã®ããã«Haskellã§ã¯ã颿°ãå®çŸ©ããéãããŸãã§å€æ°ãå®çŸ©ãããã®ããã«=ã䜿ããŸããã¡ãã£ãšå€ãã£ãŠããŸããã
ãŸããæ»ãå€ã瀺ãã®ã«returnã®ãããªæ§æãäžå䜿ã£ãŠããªãç¹ã«ã泚ç®ããŠãã ããã
Haskellã«ã¯ãreturnæãã®ãããªãã®ã¯ãªãã=以éã«æžããåŒã®çµæããã®ãŸãŸé¢æ°ã®æ»ãå€ãšãªããŸãã
Haskellã®é¢æ°ã¯ç°¡åãªæ§æã§äœ¿ãã
ããŠããŠèª¬æã¯ãã®ãããã«ããŠãå®çŸ©ããbmi颿°ãGHCiäžã§äœ¿çšããŠã¿ãŸãããã
ãŸãã¯ã:l bmi.hsãšããŠãbmi颿°ãæžãããã¡ã€ã«ãèªã¿èŸŒã¿ãŸãã
Prelude> :l bmi.hs [1 of 1] Compiling Main ( bmi.hs, interpreted ) Ok, modules loaded: Main.
颿°ãå®çŸ©ãããã¡ã€ã«ãèªã¿èŸŒããããæ¬¡ã®ããã«bmi èº«é· äœéãšãã圢åŒã§å
¥åããŠbmi颿°ãå®è¡ã§ããŸãã
*Main> bmi 1.7 60 20.761245674740486
ã¡ãããšå®è¡ã§ããããã§ããïŒ
äžèšã®éããHaskellã§ã¯ã颿°åŒã³åºãã®éã«äžžã«ãã³ã䜿ãããšããªãã§ãããè€æ°ã®åŒæ°ãåºåãã®ã«ã«ã³ãã䜿ãããšããããŸããã 颿°åãšåŒæ°ãããã¹ãŠã¹ããŒã¹ã§åºåã£ãŠäžŠã¹ãã ãã§ãïŒé¢æ°ã®åŒã³åºãã§äžžã«ãã³ã䜿ããšããããçµåã®åªå é äœã瀺ãããã ãã«äœ¿ããŸãïŒã
Haskellã«éãããšããããã°ã©ãã³ã°ã§ã¯é¢æ°åŒã³åºãã¯éåžžã«é »ç¹ã«æžããã®ã§ãããã䜿ããã®ãç°¡åãªæ§æã§äœ¿ããã®ã¯ããããã§ãããïŒ
æåŸã«ãGHCiãçµäºãããšãã¯:qïŒ:quitã®çç¥åœ¢ïŒãšå
¥åããŸãããã
> :q Leaving GHCi.
Haskellã®åºæ¬çãªåã«èŠªãããïŒGHCiããã£ãšäœ¿ãããªãã€ã€ïŒ
Haskellã«ãããŠæšæºã§äœ¿ããããŒã¿åãããã®ãªãã©ã«ã«ã€ããŠç޹ä»ããŸãã
ã€ãã§ã«ãããå°ãGHCiãšèŠªãããªããŸãããã
çµäºãããçŽåŸã§æçž®ã§ãããããäžåºŠstack ghciã³ãã³ãã§GHCiãèµ·åããŠãã ããã
$ stack ghci
>
BoolåïŒã€ãã§ã«ã:tãã³ãã³ãïŒ
Boolã¯ãããã°ã©ãã³ã°ã§ããªãã¿ã®è«çå€ã衚ãåã§ããHaskellã§ã¯ãçãTrueãåœãFalseã§è¡šãããŸã
ïŒPythonã®çåœå€ã®ããã«ã倧æåã§å§ãŸããŸãïŒã
> True True > False False
GHCiã«ã¯ã:tã³ãã³ãïŒ:typeã®çç¥åœ¢ïŒãšãããåŒã®åã確ãããããã®ã³ãã³ããçšæãããŠããŸãã
TrueãšFalseãBoolåã§ããããšãã:tã³ãã³ãã䜿ã£ãŠç¢ºãããŠã¿ãŸãããã
> :t True True :: Bool > :t False False :: Bool
:tã³ãã³ããå®è¡ãããšãåŒã®åŸã«ç¶ããŠã:: åã®ååãšãã圢åŒã§ã察象ã®åŒã®åãäœããæããŠãããŸãã
äžèšã®äŸã¯åçŽãããŠããŸãããããã¿ããªãã§ããããã£ãšè€éãªåŒããåããŠäœ¿çšãã颿°ã«ã€ããŠèª¿ã¹ããšãã«ã¯ã:tã³ãã³ãã§åã確èªããããšãããã°ã©ã ã®çè§£ã確å®ã«ä¿é²ããŠãããŸãã
è«çç©ãè«çåã«ã€ããŠã¯ãããªãã¿ã®&&ã||ã䜿ããŸãã
> True && False > False > True && True > False > True || False > True > False || False > False
è«çã®åŠå®ããå€ãã®ããã°ã©ãã³ã°èšèªã§ããªãã¿ã®!âŠâŠãšèšããããšããã§ãããéããŸãïŒ
Boolåã®åŠå®ã¯ãæåéãnotã§ãã
> not True False > not False True
å人çã«ã¯ã!ãåŠå®ã衚ãããšã«éåæãããã®ã§ãHaskellãåŠãã§è«çåŠå®ãnotã§ãããšç¥ã£ããšãã¯å€§å€ããããã£ãã§ãïŒ
!ãããèŠèŠçã«ç®ç«ã¡ãŸãããïŒ
颿°å
Haskellã®notãšãå€ãã®ããã°ã©ãã³ã°èšèªã«ããã!ã«ã¯ãèŠãç®ä»¥å€ã«ã倧ããªéãããããŸãã
ããããè«çæŒç®åã¯ãå€ãã®ããã°ã©ãã³ã°èšèªã§ã¯é¢æ°ãšãããŠããŸããããHaskellã§ã¯notããŸã颿°ãªã®ã§ãã
颿°ãªã®ã§ãnotã«ã:tã³ãã³ãã䜿ããŸããå®éã«è©ŠããŠã¿ãŸãããã
> :t not not :: Bool -> Bool
åãšããŠãBool -> Boolãšããæååãè¿ã£ãŠããŸããã
ããã¯ããBoolïŒåã®å€ïŒãåãåã£ãŠBoolïŒåã®å€ïŒãè¿ã颿°åãã衚ããŠããŸãã
->ãšããèšå·ããåã衚ãã®ã«äœ¿ããããšããç¹ã«ãã¡ãã£ãšé¢é£ãã£ãæ¹ããããããããŸããã
Haskellã§ã¯ãããããã颿°åããã°ã©ãã³ã°èšèªãã®å€ããšåãããã«ã颿°ããã¡ãŒã¹ãã¯ã©ã¹ãªããžã§ã¯ããšãªã£ãŠããŸãã
ã€ãŸãã颿°ããBoolãæååãæŽæ°ãªã©ãšåæ§ã«ã倿°ã«ä»£å
¥ãããã颿°ã®åŒæ°ãšããŠæž¡ãããããããšãã§ããã®ã§ãã
å®ãããã°ãbmi颿°ãå®çŸ©ãããšãã«äœ¿ã£ã
bmi height weight = weight / height ^ 2
ãšããæ§æãã颿°ãªããžã§ã¯ããbmiãšãã倿°ã«ä»£å
¥ããæ§æïŒã®1ã€ïŒã«éããŸããã
ãªã¹ãå
ãªã¹ãåã¯äžèšã®ãããªãªãã©ã«ã§è¡šãããŸãã
:tã³ãã³ãã§åãèŠãªãã確ãããŠã¿ãŸãããã
> :t [True, False, False] [True, False, False] :: [Bool]
è§æ¬åŒ§ã§å²ã£ã[Bool]ãšãã衚èšãããBoolåïŒã®å€ïŒã®ãªã¹ãåãã§ããããšã衚ããŠããŸãã
ãªã¹ãã®é·ãã«å¶éã¯ãããŸãããããªã¹ãã®èŠçŽ ã¯ãã¹ãŠåãåã§ãªããã°ãªããŸããã
ãªã¹ãã®é·ããç¥ããããšãã¯ãlength颿°ã䜿ããŸãããã
> length [True, False, False] 3
ãªã¹ããçµåããããšãã¯ã++ãšããæŒç®åã䜿ããŸãã
> [True] ++ [True, False] [True,True,False]
reverse颿°ã䜿ããšããªã¹ããéé ã«äžŠã³æ¿ããããšãã§ããŸãã
> reverse [True, True, False]
[False,True,True]
ãªã¹ãã空ãã©ããç¥ããããšãã¯ãnullãšãã颿°ã䜿ããŸãã
ã¡ãã£ãšå€ãªååãªã®ãæ©ãŸããã§ããã
> null [False, False, True] False > null [] True
æååã»æååå
Haskellã§ã¯ãæååãšæåååãå³å¯ã«åãããŠããŸãã
ãŸããæååã®å€ã¯ãäžèšã®ããã«ã·ã³ã°ã«ã¯ã©ãŒãã'ãã§å²ãããšã§è¡šèšããŸãã
> :t 'a' 'a' :: Char
ããã«å¯ŸããŠãæåååã®å€ã¯ãããã«ã¯ã©ãŒãã"ãã§å²ãããšã§è¡šèšããŸãã
> :t "a" "a" :: [Char]
:tã®çµæã[Char]ãšãªã£ãŠããããšããããããšãããHaskellã®æšæºã®æååã¯å®éã«ã¯ãæåã®ãªã¹ããã§ãã
ãªã®ã§ã"a"ã¯['a']ãšç䟡ã§ãã
> ['a'] "a"
GHCiäžã§ããããã«ã¯ã©ãŒãã§å²ã£ãŠè¡šç€ºãããŸãããã
äžèšã®ããã«:tã³ãã³ãã§ã¯[Char]ãšè¡šç€ºãããæååã§ããã䟿å®ã®ããã[Char]ã«ã¯Stringãšããããªãã¿ã®ååã§ãåã®å¥åãã€ããŠããŸãã
äŸãã°ãäœè¡ã«ããŸãããæååãåãåã£ãŠ1è¡ããšã«åãããæååã®ãªã¹ããžãšå€æãã颿°linesã¯ããStringãåãåã£ãŠStringã®ãªã¹ããè¿ã颿°ããšããŠåä»ããããŠããŸãã
> :t lines lines :: String -> [String]
ã¡ãªã¿ã«ãã·ã³ã°ã«ã¯ã©ãŒãã§æååãæžãããšãããšãäžèšã®ãããªãšã©ãŒãåºããŠãããŸãã
> 'abc' <interactive>:27:1: error: ⢠Syntax error on 'abc' Perhaps you intended to use TemplateHaskell or TemplateHaskellQuotes ⢠In the Template Haskell quotation 'abc'
RubyãJavaScriptãªã©ã§ãæååãããã«ã¯ã©ãŒãã§æžããã·ã³ã°ã«ã¯ã©ãŒãã§æžãããããã£ãŠè°è«ã«ãªãããšããããŸãããHaskellã§ã¯ãã®ãããªãèªè»¢è»çœ®å Žã®è°è«ïŒbike-shed discussionïŒãïŒèªè»¢è»çœ®ãå Žã®å±æ ¹ãäœè²ã«å¡ãããšãããããŸãå®çã®ãªãè°è«ïŒã«æ©ãŸãããã«æžã¿ãŸããã
ïŒãªãããšã©ãŒã¡ãã»ãŒãžã§è§ŠããŠãããšãããã·ã³ã°ã«ã¯ã©ãŒãã§å§ãŸãæååã¯Template Haskellãšããã³ã³ãã€ã«æããã°ã©ãã³ã°ã®ããã«äœ¿çšãããããšããããŸãã Template Haskellã«ã€ããŠã¯ä»åã¯å²æããŸããïŒ
ããŠããã®æååãå®éã«ã¯æåã®ãªã¹ããªã®ã§ããªã¹ãã«äœ¿ãã颿°ã¯ãã¹ãŠæååã«å¯ŸããŠã䜿ããŸãã
çµåããããšã㯠++ ã䜿ããŸããã
> "foo" ++ "bar" "foobar"
å転ãããããšãã¯reverse颿°ã䜿ããŸãã
> reverse "abc" "cba"
æååã»æåååã«ã€ããŠããå°ã
ããã§ããããç¥ãããšæªããç¥ããããããŸãã
ãŸãã¯ããããç¥ããã§ãã Haskellã®æååã¯ãå éšçã«ã¯Unicodeã®1æåãšããŠè¡šçŸãããã®ã§ãæ¥æ¬èªã®æåãæ®éã«äœ¿ããŸãïŒ èšå¿µã«èªåã®ååãæŒ¢åãã«ã¿ã«ãã§GHCiã«æã¡èŸŒãã§ã¿ãŸãããïŒ
> "å±±æ¬æ æ»" "\23665\26412\24736\28363"
ãã£ãšâŠâŠãäœãã笊å·åããã圢ã§åºåãããŠããŸããŸãããã
ããããHaskellã®æååãšæåååã«ã€ããŠã®æªããç¥ããã§ãã GHCiã§æåã衚瀺ãããšãæ¥æ¬èªã§äœ¿ãããæåã¯ãäžèšã®ãããªãšã¹ã±ãŒãã·ãŒã±ã³ã¹ã䜿ã£ãç¹å¥ãªæåãªãã©ã«ã§è¡šç€ºãããŠããŸãã®ã§ãïŒããã«ã€ããŠã®è©³çްã¯ãReal World Haskellãã®ä»é²ãç°¡æœã«ãŸãšãŸã£ãŠããŸãïŒã
ã¡ãããšæ¥æ¬èªãšããŠèªããç¶æ
ã§è¡šç€ºããããå Žåã«ã¯ãåŸè¿°ããputStrLn颿°ã䜿ãã®ãäžçªç°¡åã§ãããã
> putStrLn "\23665\26412\24736\28363" å±±æ¬æ æ» > putStrLn "å±±æ¬æ æ»" å±±æ¬æ æ»
ãããã¯ãunicode-showããã±ãŒãžã䜿ããšããæããããŸãã äžèšã®ã³ãã³ãã§unicode-showãšããããã±ãŒãžãå ¥ããäžã§ã
$ stack install unicode-show
GHCiã®èšå®ãã¡ã€ã«~/.ghciïŒWindowsã§ã¯C:\Users\<ãŠãŒã¶ãŒå>\.ghciïŒã«ä»¥äžã®å
容ã远å ããŠãã ããã
import qualified Text.Show.Unicode :set -interactive-print=Text.Show.Unicode.uprint
ãã®ããã§stackããGHCiãåèµ·åããŠããããããŠæååãªãã©ã«ã§æ¥æ¬èªãå ¥åããŠã¿ãŸãããã
$ stack ghci > "å±±æ¬æ æ»" "å±±æ¬æ æ»"
ä»åºŠã¯ç¡äºã«çè ã®ååã衚瀺ãããŸããïŒ
æ°å€åãšåã¯ã©ã¹ã«ã€ããŠç°¡åã«
ãã§ã«bmi颿°ã§æ°å€ãæ±ãäŸãèŠãŸããããHaskellã«ã¯ãããããªæ°å€åããããŸãã
å€ãã®ããã°ã©ãã³ã°èšèªã§ã銎æã¿ã®ãintãããdoubleããšãã£ãããŒã¯ãŒããã倧æåã§å§ãŸãååã«å€ãããã®ããã ãããæ°å€åãšããŠäœ¿ãããšæãã°ããã§ãããã
æšæºçãªæ°å€å
æšæºã§äœ¿çšã§ããæ°å€åãäžèšã®è¡šã«ãŸãšããŸãïŒãªããããã§ãæšæºã§ããšãã£ãŠããã®ã¯ãPreludeãšããããã±ãŒãžã«ãããã®ããšããæå³ã§ããããã以å€ã«ããInt32ãRationalãšãã£ãæ°å€ã®ããã®åããããŸããã該åœããããã±ãŒãžã®importãå¿
èŠã«ãªããŸãïŒã
| åå | çš®é¡ |
|---|---|
| Int | åºå®é·ç¬Šå·ä»ãæŽæ°ïŒäœ¿çšã§ãã粟床ã¯å®è£ äŸåïŒ |
| Integer | ä»»æç²ŸåºŠã®ç¬Šå·ä»ãæŽæ° |
| Float | å粟床浮åå°æ°ç¹æ° |
| Double | å粟床浮åå°æ°ç¹æ° |
| Word | åºå®é·ç¬Šå·ãªãæŽæ°ïŒäœ¿çšã§ãã粟床ã¯å®è£ äŸåïŒ |
ãããã®æ°å€åã«ã¯ããã¯ãå€ãã®ããã°ã©ãã³ã°èšèªã§èŠæ £ãããªãã©ã«ãçšæãããŠããŸãã
-- æŽæ° > 114514 114514 -- å°æ° > 3.141592 3.141592 -- ææ°è¡šèš > 1.43e6 1430000.0 -- 16鲿° > 0x16 22 -- 8鲿° > 0o16 14
ãã¡ããããããã®æ°å€åã«å¯ŸããŠã¯ãåçš®ã®ååæŒç®ãå®çŸ©ãããŠããŸãã
> 114514 + 3.141592 114517.141592 > 3.141592 - 1.43e6 -1429996.858408 > 1.43e6 * 0x16 3.146e7 > 0x16 / 0o16 1.5714285714285714
äžèšã®3ã€ãã®äŸã§ã¯ã1.43e6 * 0x16ãšããå
·åã«ãææ°è¡šèšã®æ°å€ãš16鲿°è¡šèšã®æ°å€ãšã§æãç®ãããŠããŸãã
ããã°ã©ãã³ã°èšèªã«ãã£ãŠã¯ãææ°è¡šèšã®æ°å€ãªãã©ã«ã¯æµ®åå°æ°ç¹æ°å°çšã16鲿°è¡šèšã®æ°å€ãªãã©ã«ã¯æŽæ°å°çšãšæ±ºãŸã£ãŠããã®ã§ããã®ããã«ååæŒç®ãæžããããšãäžæè°ã«æããæ¹ãããã£ããããããããŸããã
ãããã*ãšããæŒç®åã¯ããã®äŸã®ãããªåŒæ°ã®çµã¿åããããæå®ã§ããªãããã§ã¯ãããŸããã
ææ°è¡šèšã®æ°å€ãªãã©ã«ã©ããã®æãç®ã¯ãã¡ãããããŸããŸãªæ°å€ãªãã©ã«ã©ããã®æãç®ã衚ãã®ã«ãåã*ãšããæŒç®åã䜿ããŸãã
åã峿 ŒãªHaskellã§ãã©ãããŠãããªããšãå¯èœãªã®ã§ããããïŒ ãããã®æ°å€ãªãã©ã«ã¯ããã£ããã©ããªåã«ãªã£ãŠããã®ã§ãããïŒ
ãã£ãã:tã³ãã³ãã䜿ã£ãŠç¢ºèªããŠã¿ãŸãããã
> :t 114514 114514 :: Num t => t > :t 3.141592 3.141592 :: Fractional t => t > :t 1.43e6 1.43e6 :: Fractional t => t > :t 0x16 0x16 :: Num t => t > :t 0o16 0o16 :: Num t => t
ããããã®æ°å€ãªãã©ã«ã«å¯ŸããŠããã®åã衚瀺ãããŠããã¯ãã§ãããNum t => tã®ããã«ããªãã ãèŠæ
£ããªãã=>ããšããèšå·ãå«ãã§ããŸãã
ããã¯ãã£ããäœã§ãããïŒ
åã¯ã©ã¹
ã=>ãã¯ãHaskellã®åã¯ã©ã¹å¶çŽãšåŒã°ãããã®ã衚ããŠããŸãã
å
·äœçã«ã¯ã=>ã®å·ŠåŽã«åºãŠããNumããFractionalãšæžããããã®ãåã¯ã©ã¹ã§ãã
ãããŠã=>ã®å³åŽã«åºãŠãããã®ïŒãã®å Žåã¯ã©ããtïŒã¯ãã=>ã®å·ŠåŽã§ç€ºãããŠããåã¯ã©ã¹ã«å±ããŠããïŒãšããïŒåãã§ãã
åã¯ã©ã¹ã«ã€ããŠã¯æ¬¡åãè§Šããäºå®ãªã®ã§ãããŸã®ãšããã¯ãåããããªç¹åŸŽïŒæ¯ãèãïŒãæã£ãåããã²ã£ããããŠæ±ããããã«ããä»çµã¿ããšã ãèŠããŠãããŠãã ãã ïŒãã®æå³ã§ã¯ãJavaãªã©ã®ããã°ã©ãã³ã°èšèªã«ãããinterfaceãšå°ã䌌ãŠããé¢ããããŸãïŒã
äŸãã°ãäžèšã§ã¯114514ã0x16ãšãã£ãæ°å€ãªãã©ã«ã«å¯ŸããŠNum t => tãšããçµæã瀺ãããŠããŸãããããã¯ããããã®æ°å€ãªãã©ã«ã®åããNumåã¯ã©ã¹ã«æå±ããåã®ãã¡äœããã§ããããšã瀺ããŠããŸãã
åæ§ã«ã3.141592ã1.43e6ãšãã£ãæ°å€ãªãã©ã«ã«å¯ŸããŠã¯Fractional t => tãšããçµæã瀺ãããŠããŠãããã¯ãFractionalåã¯ã©ã¹ã«æå±ããåã®ãã¡äœããã§ãããšããæå³ã§ãã
ã€ãŸãããããã®æ°å€ãªãã©ã«ã¯ããã®æç¹ã§ã¯å
·äœçãªåãæ±ºãŸã£ãŠããªãã®ã§ãã
ã¡ãã£ãšå¥åŠã§ãããã
ã§ã¯ããããã®æ°å€ãªãã©ã«ã®åã¯ãã€æ±ºãŸãã®ã§ãããïŒ å®ã¯ãããã°ã©ã ã®äžã§ãã®æ°å€ãªãã©ã«ãã©ã®ãããªé¢æ°ã«æž¡ãããŠããããã©ã®ãããªå€æ°ã«ä»£å ¥ãããŠããããªã©ãã³ã³ãã€ã©ãŒãèŠãŠãããããåãæšæž¬ããŠæ±ºããŸãã æšæž¬ããŠãåãæ±ºå®ã§ããªãå Žåã¯ãã³ã³ãã€ã«ãšã©ãŒãšãªããŸãã
GHCiã§åã¯ã©ã¹ã確èªãã
åã¯ã©ã¹ã®å®çŸ©ãGHCiäžã§ç¢ºèªããã«ã¯ã:iã³ãã³ãïŒ:infoã®çç¥åœ¢ïŒã䜿ããŸãïŒ:iã¯ãå®éã«ã¯åã¯ã©ã¹ã ãã§ãªããæ®éã®åã倿°ã«å¯ŸããŠã䜿ããŸãïŒã
> :i Num class Num a where (+) :: a -> a -> a (-) :: a -> a -> a (*) :: a -> a -> a negate :: a -> a abs :: a -> a signum :: a -> a fromInteger :: Integer -> a {-# MINIMAL (+), (*), abs, signum, fromInteger, (negate | (-)) #-} -- Defined in âGHC.Numâ instance Num Word -- Defined in âGHC.Numâ instance Num Integer -- Defined in âGHC.Numâ instance Num Int -- Defined in âGHC.Numâ instance Num Float -- Defined in âGHC.Floatâ instance Num Double -- Defined in âGHC.Floatâ
class Num a whereããäžã®ã€ã³ãã³ããããŠããæ°è¡ããNumåã¯ã©ã¹ã®å®çŸ©ã«çžåœããŸãã
詳ãã説æã¯çããŸããã+ã*ãnegateã®ãããªããã®Numåã¯ã©ã¹ã«å±ããåã§å®çŸ©ãããŠããã¹ã颿°ïŒæŒç®åïŒãåæãããŠããã®ããªããšãªãããããšæããŸãã
ããã«ããã®äžã«ç¶ãå
é ãinstanceãšããããŒã¯ãŒãã®åè¡ã¯ãNumåã¯ã©ã¹ã«å±ããŠããå
·äœçãªåã瀺ããŠããŸãã
å
ã®è¡šã«æããåæ°å€åïŒIntegerãDoubleãªã©ïŒãNumåã¯ã©ã¹ã«å±ããŠãããšããããšãèªã¿åãããšæããŸãã
1.43e6 * 0x16ã®ãããªæžãæ¹ãã§ããçç±ããããã§ã ãããæããšã£ãŠããããã§ããããïŒ
Fractionalåã¯ã©ã¹ã®å®çŸ©ãèŠãŠã¿ãŸãããããã¡ãã¯å²ãç®ïŒ/ïŒãªã©ãå®çŸ©ãããŠããããã§ããã
> :i Fractional class Num a => Fractional a where (/) :: a -> a -> a recip :: a -> a fromRational :: Rational -> a {-# MINIMAL fromRational, (recip | (/)) #-} -- Defined in âGHC.Realâ instance Fractional Float -- Defined in âGHC.Floatâ instance Fractional Double -- Defined in âGHC.Floatâ
Numåã¯ã©ã¹ãšFractionalåã¯ã©ã¹ã®ããã©ã«ãå
å ã»ã©ãåãæšæž¬ã§ããªãå Žåã¯ã³ã³ãã€ã«ãšã©ãŒã«ãªããšèšããŸãããã Numåã¯ã©ã¹ãšFractionalåã¯ã©ã¹ã«éã£ãŠã¯ãããã ãšå®çšäžäžäŸ¿ãªããšãå€ãã®ã§ãæšæž¬ããŠåã倿ã§ããªãå Žåã«ã¯æ¬¡ã®ãããªã«ãŒã«ã§ããã©ã«ãã®åãæ±ºããŸãã
- å°æ°ç¹ãå«ãŸãªãæ°å€ã®ãªãã©ã«ïŒæŽæ°ã®ãªãã©ã«ïŒã ãã©ãªãã®åãããããªã =>
Numåã¯ã©ã¹ãšããŠè§£éãããã®ããã©ã«ãã®åã§ããIntegeråã«æ±ºããã - å°æ°ç¹ãå«ãæ°å€ã®ãªãã©ã«ã ãã©ãªãã®åãããããªã =>
Fractionalåã¯ã©ã¹ãšããŠè§£éãããã®ããã©ã«ãã§ããDoubleåã«æ±ºããã
ãã®ããšã確ãããããã«ãGHCiã§æ¬¡ã®ã³ãã³ããæã£ãŠGHCã®èŠå衚瀺ãæå¹ã«ããŠã¿ãŸãããã
> :set -fwarn-type-defaults
ãã®ç¶æ ã§ãæŽæ°ã®ãªãã©ã«ãGHCiã«å ¥åããŠã¿ãŠãã ããã äžèšã®ãããªèŠåã衚瀺ãããã¯ãã§ãã
> 1 <interactive>:7:1: warning: [-Wtype-defaults] ⢠Defaulting the following constraints to type âIntegerâ (Show a0) arising from a use of âprintâ at <interactive>:7:1 (Num a0) arising from a use of âitâ at <interactive>:7:1 ⢠In a stmt of an interactive GHCi command: print it 1 > 1 + 2 <interactive>:9:1: warning: [-Wtype-defaults] ⢠Defaulting the following constraints to type âIntegerâ (Show a0) arising from a use of âprintâ at <interactive>:9:1-5 (Num a0) arising from a use of âitâ at <interactive>:9:1-5 ⢠In a stmt of an interactive GHCi command: print it 3
é·ã£ããããèŠåã®åŸã«èšç®çµæã衚瀺ãããŠããŸãã
èŠåãèªããšããããŸãããæŽæ°ã®ãªãã©ã«ãã䜿çšããŠããªãã£ãå ŽåãGHCã¯ãããã®å€ãIntegerãšããŠè§£éããŠããããã§ãã
å°æ°ç¹ãå ¥ã£ããªãã©ã«ã䜿çšããå Žåã詊ããŠã¿ãŸãã
> 1 + 3.0 <interactive>:8:1: warning: [-Wtype-defaults] ⢠Defaulting the following constraints to type âDoubleâ (Show a0) arising from a use of âprintâ at <interactive>:8:1-7 (Fractional a0) arising from a use of âitâ at <interactive>:8:1-7 ⢠In a stmt of an interactive GHCi command: print it 4.0
ããã©ã¯DoubleãšããŠè§£éãããŸããã
å·ŠèŸºã«æŽæ°ã®ãªãã©ã«ã䜿çšããŠããå³èŸºã«å°æ°ç¹ãå
¥ã£ããªãã©ã«ã䜿çšããŠãããšãGHCã¯äž¡æ¹ã®å€ãDoubleãšããŠè§£éããããã§ãã
现ãããšããã§ãããCèšèªã®ããã«1ãIntãšããŠè§£éããŠããDoubleã«æé»ã«ãã£ã¹ãããŠããããã§ã¯ãªãã®ã§ã泚æãã ããã
ã¿ãã«å
次ã®ããã«äžžã«ãã³()ã§ã«ã³ãåºåãã®å€ãå²ããšãã¿ãã«ãšããåã®å€ã«ãªããŸãã
> ('a', True) -- CharãšBoolã®ã¿ãã« ('a',True) > :t ('a', True) ('a', True) :: (Char, Bool) -- ^ æåéãããCharãšBoolïŒã§ãµã€ãºã¯2ïŒã®ã¿ãã«ããšããåã«ãªã > :t (False, True, False) -- ãµã€ãº3ã®ã¿ãã« (False, True, False) :: (Bool, Bool, Bool) -- ^ Boolã3ã€å ¥ã£ãã¿ãã«ããBoolãšBoolãšBoolïŒã§ãµã€ãºã¯3ïŒã®ã¿ãã«ããšããåã«ãªã
è€æ°ã®å€ãä¿æã§ããã®ã§ããããªã¹ããšå¯Ÿæ¯ããŠèª¬æãããŸãããã¿ãã«ã¯äœ¿ãæ¹ãå éšã®æ§é ããªã¹ããšã¯ãŸã£ããç°ãªããŸãã ãªã¹ãã®å Žåãåããªã¹ãã«å ¥ã£ãŠããå€ã¯ãã¹ãŠåãåã§ãªããšãããŸããããã¿ãã«ã§ã¯åã®æ å ±ã«ã1åç®ã®èŠçŽ ã®åããã2åç®ã®èŠçŽ ã®åããâŠãNåç®ã®èŠçŽ ã®åããããããæžãããŠããã®ã§ãããããéã£ãŠããŠãããŸããŸããã
ãã®ãããªç¹åŸŽãããã¿ãã«ã¯ã1ã€ã®é¢æ°ããè€æ°ã®å€ãè¿ãããå Žåãªã©ã«ããæ°æ¥œãªæ§é äœããšããŠäœ¿çšãããŸãã
äŸãã°ãæŽæ°å士ã®å²ãç®ã«ãããŠãåããšãäœãããè¿ãdivModãšãã颿°ã¯ãåãšäœããã¿ãã«ã«å
¥ããããšã§è¿ããŸãã
> divMod 9 4 (2,1)
ã¿ãã«ããåã ã®èŠçŽ ãåãåºãããå Žåã¯ã次ã®ããã«ãJavaScriptã®ãã¹ãã©ã¯ãã£ãªã³ã°ã®ãããªèšæ³ã䜿çšããŸãããã
> (quotient, remainder) = divMod 9 4 > quotient 2 > remainder 1
äžèšã®ãããªãµã€ãº2ã®ã¿ãã«ã¯ãã䜿ãããã®ã§ãåèŠçŽ ãåãåºãããã®å°çšã®é¢æ°ãçšæãããŠããŸãã
ãããããfstãšsndãšãããŸãã
> quotientAndRemainder = divMod 9 4 > fst quotientAndRemainder 2 > snd quotientAndRemainder 1
ãŠãããå
ãŠãããåã¯ãåãåŸãå€ã1åãããªãããããžãç¹å¥ãªåã§ãã
ã()ãã§è¡šãããŸãã
> ()
()
:tã§åãå°ããŠããã()ã¯()ã ãããšããæããŠãããŸããã
ãŸãã§ããŒãããžãŒã§ããã
> :t () () :: ()
äžäœããããªãã®ããªãã®åœ¹ã«ç«ã€ã®ã§ãããïŒ
Haskellã«ããããŠãããåã®åœ¹å²ã¯ãCèšèªãJavaãªã©ã«ãããvoidåãšäŒŒãŠããŸãã
次ã®ç¯ã§èª¬æããŸãããæ»ãå€ãããªãããããªé¢æ°ã衚çŸããã®ã«äœ¿çšããŸãã
åãã¢ããªã±ãŒã·ã§ã³ãäœã£ãŠã¿ãŸãããïŒGHCã䜿ã£ãå®è¡ãã¡ã€ã«ã®ãã«ãïŒ
ããŠããããŸã§ã®è§£èª¬ã§ã¯å¯Ÿè©±ç°å¢ã§ããGHCiäžã§Haskellã®ã³ãŒãçãç°¡æçã«è©ŠããŠããŸããããããããã³ã³ãã€ã«ããŠå®è¡ã§ããã¢ããªã±ãŒã·ã§ã³ãæžããããªã£ãŠããé ã§ãããã
ã³ãŒãã®äžèº«ã¯åŸã§è§£èª¬ããŸãã®ã§ããšããããäžèšã®2è¡ãã奜ããªãšãã£ã¿ãŒã䜿ã£ãŠã³ããããhello.hsãšããååã§ä¿åããŠãã ããïŒ
main :: IO () main = putStrLn "Hello, world!"
ä¿åã§ããããäžèšã®ããã«stack ghcã³ãã³ãã§ã³ã³ãã€ã«ããŸãããã
$ stack ghc hello.hs [1 of 1] Compiling Main ( hello.hs, hello.o ) Linking hello ...
ã³ã³ãã€ã«ãç¡äºã«çµãã£ãããhelloãšããååã®å®è¡ãã¡ã€ã«ïŒWindowsã®å Žåã¯hello.exeïŒãã§ããã¯ãã§ãã
ã§ãããã¡ã€ã«ã¯ãçŽæ¥ãã·ã³ã§å®è¡ã§ããŸãã
å®è¡ãããšäœãèµ·ããã§ãããã?!
$ ./hello Hello, world!
ãå¯ãã®éãããHello, world!ãã衚瀺ãããŸããã
ããã§ã¯çŽæã©ãããå ã»ã©ã®ã³ãŒãã®äžèº«ã解説ããŸãããã
mainãšIOã«ã€ããŠç°¡åã«
Haskellã§ã¢ããªã±ãŒã·ã§ã³ãæžãã«ã¯ãmainãšãã颿°ãå®çŸ©ããå¿
èŠããããŸãã
main = putStrLn "Hello, world!" ^^^^ -- ãã®éšåïŒ
mainã¯ãCèšèªãªã©ã®main颿°ãšåãã§ãã³ã³ãã€ã«ããããã°ã©ã ãå®è¡ãããšãã«æåã«å®è¡ããã颿°ã§ãã
main颿°ãå®çŸ©ãããšãããHaskellã®ä»ã®é¢æ°ãå®çŸ©ãããšããšåãããã«ããŸãã§å€æ°ãå®çŸ©ãããã®ããã«=ã䜿ããŸãã
=ã®å³åŽã®putStrLn "Hello, world!"ãšããéšåã«ã€ããŠãæãäžããŠãããŸãããã
ãŸãã¯ãputStrLnãäœãªã®ãã調ã¹ãããã«ãGHCiãèµ·åããŠããªãã¿ã®:tã³ãã³ãã䜿ã£ãŠã¿ãŸãã
$ stack ghci > :t putStrLn putStrLn :: String -> IO ()
ã©ãããputStrLnã¯ã
æååïŒStringïŒãåãåãããIO ()ããšããäœãåŸäœã®ç¥ããªãåã®å€ãè¿ã颿°ã®ããã§ãã
ãããŸã§ã®åŸ©ç¿ããããŠæ³šéãå ¥ãããšãããªæãã§ãã
ããŠãputStrLnããæååãåãåã£ãŠäœããè¿ãã颿°ã§ããããšã¯ãå
ã»ã©ã®ã³ãŒãã§ãHello, world!ããšããæååãæž¡ããŠããããšããæ³åãã€ãããç¥ããŸããã
ããããè¿ã£ãŠãããã®ãIO ()ããšããã®ã¯äœè
ã§ããããïŒ
ãçŽç²ãªé¢æ°ããšãIOã¢ã¯ã·ã§ã³ã
端çã«èšããšãIO ()ã¯å
¥åºåãªã©ã®å¯äœçšãèªããããç¹å¥ãªé¢æ°ã§ãããæ»ãå€ãšããŠãŠãããå()ãè¿ããŸãã
ä»ã®Haskellã®é¢æ°ã®ããã«åŒæ°ãåãåãããã§ã¯ãªãã®ã§ãããŸã颿°ã£ãœãèŠããªããããããŸããããCèšèªã«ãããã颿°ããããªããžã§ã¯ãæåããã°ã©ãã³ã°èšèªã«ããããã¡ãœãããã®ããã«æãããšãå°ããããããèŠããã§ããã ïŒãããã·ãŒãžã£ãŒããšããèšãæ¹ã®ã»ãããã³ãšãã人ããããããããŸãããïŒã
å®ã¯ãHaskellã®äžçã§ã¯ããïŒåŒæ°ãåãåã£ãŠïŒäœãå€ãè¿ã颿°ïŒãã ãå ¥åºååŠçã¯ã§ããªãïŒããšããïŒåŒæ°ã¯åãåããªããã©ïŒå ¥åºååŠçããã€ã€äœãå€ãè¿ãããšãã§ãã颿°ãã®2ã€ãå³å¯ã«åããããŠããŸãã
ãããŠãäžè¬ã«åè
ã¯ãçŽç²ãªé¢æ°ããåŸè
ã¯ãIOã¢ã¯ã·ã§ã³ããšåŒã°ããŠããŸãã
putStrLnã®ãããªãHaskellã§å
¥åºååŠçãè¡ã颿°ã¯ããçŽç²ãªé¢æ°ããåŒæ°ãåãåãããããå
ã«ãIOã¢ã¯ã·ã§ã³ããè¿ãããšã§å®è£
ãããŠããŸãã
ãªãããçŽç²ãªé¢æ°ããšãIOã¢ã¯ã·ã§ã³ããšãåããããŠããã®ã§ãããïŒ
ããã¯ããã®èšäºã®åé ã§Haskellã®ç¹åŸŽãšããŠæãããåã«ãã£ãŠããã°ã©ã ã®å¯äœçšã管çã§ããä»çµã¿ããæäŸããããã§ãã
ååãšããŠãputStrLnã®ãããªãIOã¢ã¯ã·ã§ã³ãè¿ã颿°ãã1ãµæã§ã䜿çšãã颿°ã¯ããã¹ãŠãIOã¢ã¯ã·ã§ã³ãè¿ã颿°ãã«ãªããŸãïŒäŸå€ããããŸãããããã¯äž»ã«ãããã°ã®ããã«äœ¿ããã颿°ã§ãïŒã
çµæãšããŠããIOã¢ã¯ã·ã§ã³ãè¿ã颿°ãã¯ããã¹ãŠputStrLnãšåããããªãIO ãäœããããè¿ã颿°ãšãªããŸãã
ã€ãŸããIOã¢ã¯ã·ã§ã³ãã©ããã«åºãŠãã颿°hogeIoActionããã£ããšããŠã:tã§ãã®é¢æ°ã®åã調ã¹ããšãããšãã°æ¬¡ã®ããã«è¡šç€ºããããšããããšã§ãã
hogeIoAction :: Int -> IO ãäœãã
ãäœããã®éšåã«ã¯ããIOã¢ã¯ã·ã§ã³ããè¿ãå€ã®åãæžãããŸãã
ã€ãŸãããå
¥åºååŠçããã€ã€äœãå€ãè¿ãããšãã§ãã颿°ãã®ããã®è¿ãå€ã®åã§ãã
putStrLnã®å Žåããäœããã¯()ã ã£ãã®ã§ãè¿ãå€ã¯ãŠãããå()ã§ãã
ãŠãããåã¯ãäœã圹ã«ç«ããªãå€ãªã®ã§ããã
åç¯ã®æåŸã§ããŠãããåã®ããšããCèšèªãJavaãªã©ã«ãããvoidãšäŒŒããããªãã®ããšãã£ãã®ã¯ãããããããã ã£ãã®ã§ãã
IOã¢ã¯ã·ã§ã³ãå«ã颿°ã¯ãã¹ãŠãIO ãäœããããšããåãæã£ãŠãããšããããšã¯ãHaskellã®ã³ãŒããèªãéã«ã¯é¢æ°ã®åãèªãã ãã§ããã®é¢æ°ãå
¥åºååŠçãªã©ã®å¯äœçšãè¡ãã®ãã©ããã倿ãããšããããšã§ãã
颿°ã®å¯äœçšã®æç¡ãåã«ãã£ãŠç®¡çã§ããã®ã§ãããã°ã©ã ã«ãããå¯äœçšã確å®ã«åãåããããšãã§ããŸãã
IOã¢ã¯ã·ã§ã³ã®çµæãåãåã
å®éã«ããã°ã©ã ãæžããŠãããšããIOã¢ã¯ã·ã§ã³ãããè¿ãå€ãã倿°ã«ä»£å ¥ããããªãããšãå€ã ãããŸãã ããšãã°ãå®è¡æã«ãŠãŒã¶ãŒã«å€ãå ¥åããŠãããããã®å€ãããã°ã©ã ã§ååŸããŠå©çšããããšãã£ãå Žåã§ãã
äŸãšããŠã身é·ãšäœéãå
¥åããŠãããããã®å€ããåã«äœã£ãbmi颿°ã§BMIå€ãèšç®ããããã°ã©ã ãäœã£ãŠã¿ãŸãããã
ãã®ããã°ã©ã ã®å®æåœ¢ãäžèšã«ç€ºããŸãã
import System.Environment (getArgs) main = do (heightString:weightString:_) <- getArgs print (bmi (read heightString) (read weightString)) bmi height weight = weight / height ^ 2
äžèšã®ããã°ã©ã ã«ã¯ããããŸã§ã®èª¬æã§ã¯ç»å ŽããŠããªãHaskellã®æŠå¿µãããã€ãç»å ŽããŠããŸãã以äžããã¹ãŠãå®å šã«ã¯è§£èª¬ã§ããŸããããããã€ãŸãã§æŠç¥ã説æããŸãã
ãŸãããã®ããã°ã©ã å
šäœãèŠããšãmain颿°ã1ã€ã®doãšããæã§å®çŸ©ããŠããããšãæšå¯ã§ãããšæããŸãã
ãããŠããã®doã®äžïŒã€ã³ãã³ãã«æ³šç®ããŠãã ããïŒã«ãå®è¡ãããIOã¢ã¯ã·ã§ã³ã䞊ã¹ãŠæžããŠããŸããã
1ã€ãã®IOã¢ã¯ã·ã§ã³ã¯ãgetArgsã§ãã
ãã®é¢æ°ã¯ãããã°ã©ã ã®å®è¡æã«äžããããã³ãã³ãã©ã€ã³åŒæ°ãããããæååãšããŠååŸããŠããã®ãªã¹ããè¿ããšããIOã¢ã¯ã·ã§ã³ã§ãïŒgetArgsã¯System.Environmentãšããã¢ãžã¥ãŒã«ã§æäŸãããŠããã®ã§ã1è¡ãã§ãã®ã¢ãžã¥ãŒã«ãimportããŠããŸãïŒã
getArgsã以äžã®ããã«äœ¿ãããšã§ãheightStringãšãã倿°ã«1ã€ãã®ã³ãã³ãã©ã€ã³åŒæ°ããweightStringãšãã倿°ã«2ã€ãã®ã³ãã³ãã©ã€ã³åŒæ°ã代å
¥ãããããã«ããŠããŸãã
(heightString:weightString:_) <- getArgs
2ã€ãã®IOã¢ã¯ã·ã§ã³ïŒãè¿ã颿°ïŒã¯ãprintã§ãã
ãã®é¢æ°ã¯ãç»é¢ã«è¡šç€ºã§ãããããªå€ãåŒæ°ã«ãšãããããå®éã«åºåããŸãã
ãã®printã䜿ã£ãŠãheightStringãšweightStringã®å€ãããšã«bmi颿°ã§èšç®ããçµæãåºåããããã«ããŠããŸãã
readãšãã颿°ã¯ãåŒæ°ãšããŠåãåã£ãæååããå¥ã®ããããããªåã®å€ã«å€æãã颿°ã§ãã
ããã§ã¯ãheightStringãšweightStringãããããæž¡ãããšã«ãã£ãŠãbmi颿°ã®åŒæ°ãšããŠé©åãªåã®å€ãžãšå€æããããã«äœ¿ã£ãŠããŸãã
ããã§ã¯ãäžèšã®ã³ãŒããbmi.hsã®ãããªååã§ä¿åããGHCã§ã³ã³ãã€ã«ããŠå®è¡ããŠã¿ãŸãããã
$ stack ghc bmi.hs [1 of 1] Compiling Main ( bmi.hs, bmi.o ) Linking bmi ... $ ./bmi 1.7 60 20.761245674740486
ããŸããããŸãããïŒ
ããã¡ãã£ãšåã£ã颿°ãäœã£ãŠã¿ãŸãããïŒæ¬¡åäºåïŒ
ãããŸã§ãHaskellã®éçºç°å¢ã®æ§ç¯æ¹æ³ã«å§ãŸãã察話ç°å¢ã§ããGHCiã®äœ¿ãæ¹ãéããŠã颿°ã®å®çŸ©æ¹æ³ããåºæ¬çãªåãšãã®ãªãã©ã«ã«ã€ããŠèª¬æããŠããŸããã
ããããå ã¯ããã£ã𿬿 Œçãªãµã³ãã«ã¢ããªã±ãŒã·ã§ã³ã®éçºã«åããŠãããå®è·µçãªHaskellã®æ©èœã説æããŠããããšã«ããŸãã å ·äœçã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ä»æ§ã«åºã¥ããŠãªãªãžãã«ã®åãå®çŸ©ãããã®åãå©çšããè€éãªé¢æ°ãæžããŠãããŸãã
ããã®èšäºã§ã¯é¢æ°ã®æžãæ¹ãã説æããªãã®ïŒããšãã¡ãã£ãšèœèããŠããŸãæ¹ããããããããŸããã ããããèœèããã«ã¯åã³ãŸããã Haskellã«ããããã°ã©ãã³ã°ã®å€§ããªéšåãå ããã®ã¯ãåé¡ã«åãããåãèªåã§èããŠå®çŸ©ãããã®åãå©çšãã颿°ãæžãããšã§ãã ãã®ééå³ã次åã¯å³ãã£ãŠããã ãäºå®ã§ãã
顿ãšããŠåãäžããã®ã¯ããã©ã³ãã²ãŒã ã®ããã©ãã¯ãžã£ãã¯ãã§ãã ãã©ãã¯ãžã£ãã¯ã¯ã芪ããé ãããææã®åèšã21ã«ããããšãç®æãã²ãŒã ã§ãã åèšã®èšç®ã§ã¯ã次ã®ãããªã«ãŒã«ã«åŸã£ãŠã«ãŒããæ°ããŸãã
æåã«èŠªããé ãããææã¯2æã§ãããåã¯è¿œå ã®ã«ãŒãã奜ããªã ãèŠæ±ã§ããŸãã远å ã®ã«ãŒããèŠæ±ããããšã§ãåèšã21ã«ãªãã¹ãè¿ã¥ããŠããã®ã§ãããããã«ãã£ãŠåèšã21ãè¶ããŠããŸã£ããè² ãã§ãã
ãšãŒã¹ïŒAïŒã®æ°ãæ¹ã2éãããã®ã§ãææã®æ°åãåçŽã«åç®ããã ãã§ãªããä»ã®ã«ãŒããšã®çµã¿åãããèããæ¡ä»¶åå²ãå¿ èŠã«ãªãããšãæ³åã§ããŸããã ããã§æ¬¡åã®èšäºã§ã¯ããã®ãææã®ã«ãŒãããæãåã¡ã«è¿ãç¹æ°ãèšç®ãããéšåãŸã§ãäœã£ãŠã¿ãããšã«ããŸãã
ãã®å®è£
ãéããŠãä»åã®èšäºã§èª¬æããå
¥éããäžæ©è¶³ãèžã¿åºããHaskellãããããã°ã©ã ã®èšèšã®ä»æ¹ãšå®è£
ã®ä»æ¹ããå®äœéšããŠããã ãããšæããŸãã
ãæ¥œãã¿ã«ïŒ
å®è·µç·šïŒHaskellãããã¢ããªã±ãŒã·ã§ã³éçºããŸãåãå®çŸ©ãã¹ãã第äºèšèªãšããŠã®Haskellã
çºå±ç·šïŒ Haskellã§ãåãã®ããã³ã·ã£ã«ãæå€§éã«åŒãåºãã«ã¯ïŒã第äºèšèªãšããŠã®Haskellã
å·çè ãããã£ãŒã«
å±±æ¬æ æ»ïŒããŸããšã»ãããïŒ
âœ æ¥æ¬HaskellãŠãŒã¶ãŒã°ã«ãŒã - Haskell-jp
ç·šéååïŒé¹¿éæ¡äžéïŒããã®ã»ãããã¡ããã
-
å®éã®ãšããã
PATHãæžãæãããããããšããªããstackã³ãã³ããéããŠäœ¿çšãããã®ãªã®ã§ãããããšã¯rbenvãpyenvããããªãæ§ããã§ããã®åãããã«ããã§ããâ©




