
Haskellã®çããŠé£ãã玹ä»ã®æåã®éšåã 2çªç®ã®éšåã¯
ããã«ãããŸããtl; dr ïŒHaskellã®éåžžã«çãç°¡æœãªç޹ä»ã
UPDã ãã¥ãŒããªã¢ã«ãæ°ã«å
¥ã£ããã
å
ã®èšäºã®èè
ã«æ°è¡ãããããããŠ
ãã ãã ã 人ã¯åãã§ããŸã;ïŒ
ç§ã¯ãã¹ãŠã®éçºè
ãHaskellãåŠã¶ã¹ãã ãšæ¬åœã«ä¿¡ããŠããŸãã 誰ããã¹ãŒããŒãã¹ã±ã«å¿è
ã«ãªãã¹ãã§ã¯ãªããšæããŸãã 人ã
ã¯ãHaskellãæäŸããæ©äŒã«æ³šæããå¿
èŠããããŸãã HaskellãåŠç¿ãããšãæèãåºãããŸãã
äž»æµã®èšèªã¯éåžžã«äŒŒãŠããŸã
- 倿°
- ãµã€ã¯ã«
- ãã€ã³ã¿ãŒïŒã»ãšãã©ã®èšèªããã®äºå®ãé ãããšããŠããäŸç¶ãšããŠäºå®ã®ãŸãŸã§ãïŒ
- æ§é ããªããžã§ã¯ããããã³ã¯ã©ã¹ïŒã»ãšãã©ã®èšèªïŒ
Haskellã¯ããããšã¯å€§ããç°ãªããŸãã ãã®èšèªã¯ããããŸã§èããããšããªãæŠå¿µã®æã䜿çšããŠããŸãã ãããã®æŠå¿µã®å€ãã¯ãããåªããããã°ã©ããŒã«ãªãã®ã«åœ¹ç«ã¡ãŸãã
ããããHaskellã®åŠç¿ã¯é£ããå ŽåããããŸãã å°ãªããšãç§ã«ãšã£ãŠã¯é£ããããšã§ããã ãããŠãã®èšäºã§ã¯ãå匷ã®éçšã§æ¬ ããŠãããã®ãèŠããããšããŸãã
ãã®èšäºããã¹ã¿ãŒããã®ã¯é£ããã§ãããã ããã¯æå³çã«è¡ãããŸããã HaskellãåŠã¶ç°¡åãªæ¹æ³ã¯ãããŸããã ãã®éã¯é£ãããŠé£ããã§ãã ããããããã¯è¯ãããšã ãšæããŸãã è峿·±ãã®ã¯ãHaskellã®è€éãã ããã§ãã
Haskellãç¿åŸããéåžžã®æ¹æ³ã¯ã2åã®æ¬ãèªãããšã§ãã
æåã«
ãLearn You a Haskellã ãæ¬¡ã«
ãReal World Haskellã ã
ãããåŠç¿ãžã®æ£ããã¢ãããŒãã§ããããšã«åæããŸãã ããããHaskellãäœã§ããããçè§£ããã«ã¯ããããã®æ¬ãéåžžã«æ³šææ·±ãèªãå¿
èŠããããŸãã
äžæ¹ããã®èšäºã¯Haskellã®ãã¹ãŠã®åºæ¬çãªåŽé¢ãéåžžã«ç°¡æœãã€ç°¡æœã«ç޹ä»ããŠããŸãã Haskellãå匷ãããšãã«æ¬ ããŠãããã¥ã¢ã³ã¹ãããã€ã远å ããŸããã
ãã®èšäºã¯5ã€ã®ããŒãã§æ§æãããŠããŸãã
- ã¯ããã«ïŒHaskellãæããç¥ããªãããšã瀺ãçãäŸã§ãã
- Haskellã®åºæ¬ïŒHaskellæ§æãšããã€ãã®åºæ¬æ§é ã
- é£ããéšåïŒ
- æ©èœçãªã¹ã¿ã€ã«; åœä»€åããæ©èœåãžã®ç§»è¡ã®äŸ
- ã¿ã€ã; ã¿ã€ããšæšæºã®äºåæšã®äŸ
- ç¡éã®æ§é ; ç¡éã®äºåæšã§åäœããŸãïŒ
- ãããŒé£ããéšåïŒ
- IOãæ±ããŸãã æå°éã®äŸ
- IOã䜿çšããããªãã¯ã®åæã ç§ãçè§£ããã®ã劚ããæçœã§ãªãäºçްãªããš
- ã¢ãã éçŸå®çã«åŒ·åãªæœè±¡åããŒã«
- ã¢ããªã±ãŒã·ã§ã³ïŒ
- ç¡éã®æšã«ã€ããŠã®ããå°ãã®èšè; ç¡éã®æšã®æ°åŠæåã®è°è«
泚ïŒãã¡ã€ã«åãšæ¡åŒµåã.lhs
åºåãæåã衚瀺ããã.lhs
ã
ããŠã³ããŒãã§ããŸãã
ãã¡ã€ã«ãfilename.lhs
ãšããŠä¿åãããšã次ã®filename.lhs
ã§å®è¡ã§ããŸãã
runhaskell filename.lhs
ããã€ãã®äŸã¯åäœããªããããããŸããããã»ãšãã©ã¯åäœããã¯ãã§ãã
以äžã«ããã¡ã€ã«ãžã®ãªã³ã¯ã衚瀺ãããŸã
01_basic / 10_Introduction / 00_hello_world.lhsã¯ããã«
èšçœ®

ãŠãŒãã£ãªãã£ïŒ
ghc
ïŒ C
gccã«äŒŒãã³ã³ãã€ã©ghci
ïŒHaskellã€ã³ã¿ã©ã¯ãã£ãã·ã§ã«ïŒREPLïŒrunhaskell
ïŒã³ã³ãã€ã«ããã«ããã°ã©ã ãå®è¡ããŸãã 䟿å©ã§ãããã³ã³ãã€ã«ãããããã°ã©ã ã«æ¯ã¹ãŠéåžžã«é
ãã§ãã
ãããã¯ãªã

å€ãã®æ¬ãèšäºã¯ãããã€ãã®é£è§£ãªå
¬åŒïŒã¯ã€ãã¯ãœãŒãããã£ãããããªã©ïŒã§Haskellãç¥ã£ãŠããŸãã ç§ã¯ç°ãªã£ãè¡åãããŸãã Haskellã®è¶
倧åœãããã«ã¯èŠããŸããã Haskellãä»ã®ããã°ã©ãã³ã°èšèªã«äŒŒãŠãããã®ã«éäžããŸãã ããã§ã¯ãããªãã¿ã®ãHello Worldãããå§ããŸãããã
main = putStrLn "Hello World!"
å®è¡ããã«ã¯ããã®ã³ãŒãã
hello.hs
ãšããŠä¿åãã
hello.hs
ãå®è¡ããŸãã
~ runhaskell ./hello.hs Hello World!
ãã¯ããã«ãã®äžã«ãããªã³ã¯ãããœãŒã¹ãããŠã³ããŒãã§ããŸã
ãã¡ã€ã«
00_hello_world.lhs
ãä¿åããŠå®è¡ããŸãã
~ runhaskell 00_hello_world.lhs Hello World!
01_basic / 10_Introduction / 00_hello_world.lhs
01_basic / 10_Introduction / 10_hello_you.lhs次ã«ãååãå°ããŠãããã«ã¡ã¯ãååïŒããšèšãããã°ã©ã ãäœæããŸãã
main = do print " ?" name <- getLine print (" " ++ name ++ "!")
ãŸããä»ã®åœä»€åèšèªãšäŸãæ¯èŒããŠãã ããã
// In C #include <stdio.h> int main (int argc, char **argv) { char name[666]; // <- ! // , 665 ? printf(" ?\n"); scanf("%s", name); printf(" %s!\n", name); return 0; }
ããã°ã©ã ã®æ§é ã¯éåžžã«äŒŒãŠããŸãããããããªæ§æäžã®éãããããŸãã ãã¥ãŒããªã¢ã«ã®äž»èŠéšåã§ã¯ããããã®éããæ£ç¢ºã«èª¬æããŸãã
Haskellã§ã¯ãå颿°ãšãªããžã§ã¯ãã«ã¯ç¬èªã®åããããŸãã
main
颿°ã®ã¿ã€ãã¯
IO ()
ã§ãã
ããã¯ãå®è¡æã«
main
ãå¯äœçšãåŒãèµ·ããããšãæå³ããŸãã
ããããHaskellãéåžžã®åœä»€åèšèªã®ããã«èŠããããšãå¿ããªãã§ãã ããã
01_basic / 10_Introduction / 10_hello_you.lhs
01_basic / 10_Introduction / 20_very_basic.lhsæãåºæ¬çãªHaskell

ç¶è¡ããåã«ãHaskellã®ç¹å¥ãªæ©èœã®ããã€ãã«ã€ããŠèŠåããããšæããŸãã
æ©èœæ§Haskellã¯é¢æ°åèšèªã§ãã
åœä»€åèšèªã§å§ããå Žåãå€ãã®æ°ããããšãåŠã¶å¿
èŠããããŸãã
幞ããªããšã«ããããã®æŠå¿µã®å€ãã¯ãåœä»€åèšèªã§ãããã°ã©ã ã®æ¹åã«åœ¹ç«ã¡ãŸãã
é«åºŠãªéçåä»ãC
ã
C++
ã
Java
ããã«éªéãã代ããã«ãåã·ã¹ãã ã圹ç«ã¡ãŸãã
æž
æœãäžè¬çã«èšãã°ãããªãã®æ©èœã¯å€ã®äžçã§ã¯äœãå€ããŸããã
äžæ¹ã§ãããã¯ã颿°ã倿°ã®å€ã倿Žã§ããããŠãŒã¶ãŒããããŒã¿ãåä¿¡ã§ãããç»é¢ã«æžã蟌ãããšãã§ããããã±ãããçºå°ã§ããªãããšãæå³ããŸãã
äžæ¹ãããã°ã©ã ã®äžŠååã¯ç°¡åã§ãã
Haskellã¯ãçŽç²ãªé¢æ°ãšå¯äœçšãåŒãèµ·ãã颿°ãšã®éã«æç¢ºãªç·ãåŒããŸãã
ãã®ã¢ãããŒãã«ãããããã°ã©ã ã®ããããã£ãåæããã®ãã¯ããã«ç°¡åã«ãªããŸãã
ããã°ã©ã ã®æ©èœçã«ããããªéšåã§ã¯ãã³ã³ãã€ã«æ®µéã§å€ãã®ãšã©ãŒãé€å€ãããŸãã
ããã«ãæ©èœçã«çŽç²ãªé¢æ°ã¯ãåºæ¬çãªHaskellã®æ³åã«åŸããŸãã
åããã©ã¡ãŒã¿ãŒã䜿çšãã颿°åŒã³åºãã¯ãåžžã«åãçµæããããããŸãã
æ azineããã©ã«ãã®é
å»¶ã¯ãããã°ã©ãã³ã°èšèªã§ã¯éåžžã«çããããšã§ãã
ããã©ã«ãã§ã¯ãHaskellã¯æ¬åœã«å¿
èŠãªå Žåã«ã®ã¿å€ãè©äŸ¡ããŸãã
ãã®çµæãç¡éã®ããŒã¿æ§é ãéåžžã«ç°¡åã«æ±ãããšãã§ããŸãã
æåŸã®èŠåã¯ãHaskellã®ã³ãŒããèªã䟡å€ããããã©ããã«é¢ä¿ããŸãã
ç§ã«ãšã£ãŠãããã¯ç§åŠè«æãèªããããªãã®ã§ãã
äžéšã®éšåã¯åçŽæå¿«ãããããŸããããåŒãèŠãããå Žåã¯ãéäžããŠèªãã§ãã ããã
HaskellãåŠç¿ãããšããæ§æã®æ©èœã®äžéšãå®å
šã«çè§£ããŠããªããŠãåé¡ã¯ãããŸããã
>>=
ã
<$>
ã
<-
ãªã©ã®æãããæåãæãã€ããå Žåã¯ãããããç¡èŠããŠãã³ãŒãã®äžè¬çãªèãæ¹ãçè§£ããŠãã ããã
颿°å®çŸ©
次ã®ããã«é¢æ°ãå®çŸ©ã§ããŸãã
C
ïŒ
int f(int x, int y) { return x*x + y*y; }
Javascriptã®å ŽåïŒ
function f(x,y) { return x*x + y*y; }
Pythonã®å ŽåïŒ
def f(x,y): return x*x + y*y
Rubyã®å ŽåïŒ
def f(x,y) x*x + y*y end
ã¹ããŒã ã«ã€ããŠïŒ
(define (fxy) (+ (* xx) (* yy)))
ãããŠæåŸã«ãHaskellïŒ
fxy = x*x + y*y
éåžžã«æç¢ºã§ãã æ¬åŒ§ãªãã
def
ãªãã
Haskellã¯é¢æ°ãšåãå€çšããŠããããšã«æ³šæããŠãã ããã
ãããã£ãŠããããã¯éåžžã«ç°¡åã«èå¥ã§ããŸãã
èšèªã®æ§æã¯ãå®çŸ©ãã§ããã ãåçŽã«ããããã«èæ¡ãããŸããã
æ°ããã¿ã€ããäœæããäŸ
éåžžãããã°ã©ã ãäœæãããšãã«ã颿°ã®ã¿ã€ããæå®ããŸãã
ããããããã¯å¿
èŠãããŸããã
ã³ã³ãã€ã©ãŒã¯ããããè¡ãã®ã«ååã¹ããŒãã§ãã
å°ãéã³ãŸãããã
~ runhaskell 20_very_basic.lhs 13
01_basic / 10_Introduction / 20_very_basic.lhs
01_basic / 10_Introduction / 21_very_basic.lhsä»ãã詊ããŠãã ãã
f :: Int -> Int -> Int fxy = x*x + y*y main = print (f 2.3 4.2)
ãšã©ãŒã衚瀺ãããŸãïŒ
21_very_basic.lhs:6:23: No instance for (Fractional Int) arising from the literal `4.2' Possible fix: add an instance declaration for (Fractional Int) In the second argument of `f', namely `4.2' In the first argument of `print', namely `(f 2.3 4.2)' In the expression: print (f 2.3 4.2)
åé¡ã¯
4.2
ãIntã§ã¯ãªãããšã§ãã
01_basic / 10_Introduction / 21_very_basic.lhs
01_basic / 10_Introduction / 22_very_basic.lhs1ã€ã®è§£æ±ºçã¯ã颿°
f
ã¿ã€ããæç€ºçã«æå®ããªãããšã§ãã
次ã«ãHaskellãæãäžè¬çãªé©åãªã¿ã€ããæšæž¬ããŸãã
fxy = x*x + y*y main = print (f 2.3 4.2)
皌ãã ïŒ
çŽ æŽããããåããŒã¿åã«æ°ãã颿°ãäœæããå¿
èŠã¯ãããŸããã
ããšãã°ã
C
ã§ã¯ã
int
ã
float
ã
long
ã
double
ãªã©ã®é¢æ°ãäœæããå¿
èŠããããŸãã
ããããã©ã®ã¿ã€ãã瀺ãå¿
èŠããããŸããïŒ
Haskellãã©ã®ã¿ã€ããæšæž¬ããããçè§£ããã«ã¯ãåã«ghciãå®è¡ããŸãïŒ
% ghci GHCi, version 7.0.4: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer-gmp ... linking ... done. Loading package base ... linking ... done. Loading package ffi-1.0 ... linking ... done. Prelude> let fxy = x*x + y*y Prelude> :type f f :: Num a => a -> a -> a
ããŒã...ããã¯ã©ããªå¥åŠãªã¿ã€ãã§ããïŒ
Num a => a -> a -> a
ãŸããa-
a -> a -> a
å³åŽã«æ³šæããŠãã ããã
ãããçè§£ããããã«ãããã€ãã®äŸãèŠãŠã¿ãŸãããã
æå®ãããã¿ã€ã | äŸ¡å€ |
Int | ã¿ã€ãInt |
Int -> Int | å
¥åInt ãåãåãã Int ãè¿ã颿° |
Float -> Int | Float ãåãå
¥ãã Int ãè¿ã颿° |
a -> Int | å
¥åãšããŠä»»æã®åãåãã Int ãè¿ã颿°ã®å |
a -> a | å
¥åã¿ã€ãa ãåãåããã¿ã€ãa çµæãè¿ã颿°ã®ã¿ã€ã |
a -> a -> a | å
¥åãšããŠã¿ã€ãa 2ã€ã®åŒæ°ãåããã¿ã€ãa ã®çµæãè¿ã颿°ã®ã¿ã€ã |
ã¿ã€ã
a -> a -> a
ã§ã¯ãæå
a
ã¯
ã¿ã€ã倿°ã§ã ã
ã€ãŸãã
f
ã¯2ã€ã®åŒæ°ã®é¢æ°ã§ãããäž¡æ¹ã®åŒæ°ãšçµæã¯åãåã§ãã
ã¿ã€ã
a
倿°ã¯ãããŸããŸãªã¿ã€ãã®å€ãåãããšãã§ããŸãã
ããšãã°ã
Int
ã
Integer
ã
Float
...
ãããã£ãŠã
C
ããã«åãããŒãã«èšå®ãã代ããã«ã
int
ã
long
ã
float
ã
double
ãªã©ã®é¢æ°ãåå¥ã«å®çŸ©ããŸã...
åçã«åä»ããããèšèªã®ããã«ã1ã€ã®é¢æ°ãäœæããã ãã§ãã
äžè¬çã«ã
a
ã¯ã©ã®ã¿ã€ãã§ãããŸããŸããã
Trees
ãå¥ã®é¢æ°åãªã©ã®ããè€éãªåã®
String
ã
Int
ã
ãããããã®äŸã§ã¯ãåã«ã¯æ¥é èŸ
Num a =>
ãä»ããŠããŸãã
Num
ã¯
åã¯ã©ã¹ã§ãã
åã¯ã©ã¹ã¯ãå€ãã®åãšããŠè¡šãããšãã§ããŸãã
Num
ã¯ãæ°å€ã®ããã«åäœããåã®ã¿ãå«ãŸããŸãã
ããå³å¯ã«ã¯ã
Num
ã¯ç¹å®ã®é¢æ°ã»ãããç¹ã«
(+)
ãš
(*)
ãå®è£
ããåãå«ãã¯ã©ã¹ã§ãã
åã¯ã©ã¹ã¯ãèšèªã®éåžžã«åŒ·åãªèŠçŽ ã§ãã
圌ãã®å©ããåããŠãç§ãã¡ã¯çŽ æŽãããããšãããããšãã§ããŸãã
ããããããã«ã€ããŠã¯å°ãåŸã§èª¬æããŸãã
ãããã£ãŠã
Num a => a -> a -> a
ãšæžããš
Num a => a -> a -> a
ããšãæå³ããŸãã
a
Num
åã¯ã©ã¹ã«å±ããåã«ããŸãã
ããã¯ãå
¥åãšããŠaãåãåããïŒa-
a -> a
ïŒãè¿ã颿°ã§ãã
ããŒããããã¯å¥åŠã§ãã
å®éãHaskellã§ã¯ã2ã€ã®åŒæ°ãå
¥åãšããŠåãå
¥ãã颿°ã¯ãããŸããã
代ããã«ããã¹ãŠã®é¢æ°ã«ã¯åŒæ°ã1ã€ãããããŸããã
ãã ãã2ã€ã®åŒæ°ã®é¢æ°ã¯ãæåã®åŒæ°ãåãã2çªç®ã®åŒæ°ããã©ã¡ãŒã¿ãŒãšããŠåã颿°ãšããŠè¿ãããšãã§ããããšã«æ³šæããŠãã ããã
ã
ã€ãŸãã
f 3 4
(f 3) 4
f 3 4
åçã§ãã
f 3
ã颿°ã§ããããšã«æ³šæããŠãã ããã
f :: Num a :: a -> a -> a g :: Num a :: a -> a g = f 3 gy â 3*3 + y*y
å¥ã®ãšã³ããªã䜿çšããŠé¢æ°ãäœæããããšãã§ããŸãã
ã©ã ãåŒã䜿çšãããšãååãä»ããã«é¢æ°ãäœæã§ããŸãã
ãããã¯å¿å颿°ãšãåŒã°ããŸãã
ç§ãã¡ã¯æžãããšãã§ããŸãïŒ
g = \y -> 3*3 + y*y
\
æåã¯ã
λ
æåã«äŒŒãŠãããã䜿çšãããŸãããåæã«ASCIIæåã§ãã
颿°åããã°ã©ãã³ã°ãåããŠã®å Žåããã®æç¹ã§è³ã¯æ²žéš°ãå§ããŸãã
å®éã®ã¢ããªã±ãŒã·ã§ã³ãäœæããŸãã
01_basic / 10_Introduction / 22_very_basic.lhs
01_basic / 10_Introduction / 23_very_basic.lhsãã ããéå§ããåã«ãåã·ã¹ãã ãæ£åžžã«æ©èœããããšã確èªããå¿
èŠããããŸãã
f :: Num a => a -> a -> a fxy = x*x + y*y main = print (f 3 2.4)
ãã®ã³ãŒãã¯ã
3
ãFloatåã®å°æ°ïŒå°æ°ïŒãšIntegeråã®æŽæ°ã®äž¡æ¹ã衚ãããšãã§ããããæ©èœããŸãã
2.4
ã¯åæ°åã§ããããã
3
ãåæ°ãšããŠè¡šãããŸãã
01_basic / 10_Introduction / 23_very_basic.lhs
01_basic / 10_Introduction / 24_very_basic.lhs颿°ã«ä»ã®åãæžããšãæ©èœããªããªããŸãïŒ
f :: Num a => a -> a -> a fxy = x*x + y*y x :: Int x = 3 y :: Float y = 2.4 main = print (fxy)
ã³ã³ãã€ã©ã¯ãšã©ãŒãéç¥ããŸãã
2ã€ã®ãã©ã¡ãŒã¿ãŒã¯åãã¿ã€ãã§ãªããã°ãªããŸããã
ãããæªãèãã§ãããã³ã³ãã€ã©ãŒãåã倿ããå¿
èŠããããšæãå Žåãæ¬åœã«çŽ æŽããããããªãèŠãå¿
èŠããããŸãã
ã¯ãã01_basic / 10_Introduction / 24_very_basic.lhsHaskellã®æå°èŠä»¶

ãã®ã»ã¯ã·ã§ã³ãããã«ç¢ºèªããããšããå§ãããŸãã
ãããåèè³æãšèããŠãã ããã
Haskellã¯éåžžã«å€é¢çãªèšèªã§ãã
ãããã£ãŠããã®ã»ã¯ã·ã§ã³ã®ããã€ãã®ããšã¯ã¹ããããããŸãã
å¿
èŠã«å¿ããŠãäœããããããããŸãã¯çè§£ã§ããªããšæãããå Žåã¯ãããã«æ»ã£ãŠãã ããã
ã·ã³ãã«
â
ã䜿çšããŠã2ã€ã®åŒã®ç䟡æ§ã瀺ããŸãã
ããã¯ã¡ã¿è¡šèšã§ã; Haskellã«ã¯ã¯ãããŸããã
èšå·
â
ã¯ãåŒã®è©äŸ¡çµæã瀺ãããã«äœ¿çšãããŸãã
衚çŸ
ç®è¡
3 + 2 * 6 / 3 â 3 + ((2*6)/3)
è«çç
True || False â True True && False â False True == False â False True /= False â True (/=)
ã¹ãä¹
x^n n (Int Integer) x**y y ( Float)
Integer
ã¯ããã·ã³ã®RAMãé€ãããµã€ãºã®å¶éã¯ãããŸããã
4^103 102844034832575377634685573909834406561420991602098741459288064
ããããïŒ
ãããŠãæçæ°ã䜿çšã§ããŸãïŒ
ãã ãããã®ããã«ã¯
Data.Ratio
ã¢ãžã¥ãŒã«ã䜿çšããå¿
èŠããããŸãã
$ ghci .... Prelude> :m Data.Ratio Data.Ratio> (11 % 15) * (5 % 3) 11 % 9
ãªã¹ã
[] â [1,2,3] â ["foo","bar","baz"] â (String) 1:[2,3] â [1,2,3], (:) 1:2:[] â [1,2] [1,2] ++ [3,4] â [1,2,3,4], (++) [1,2,3] ++ ["foo"] â String â Integral [1..4] â [1,2,3,4] [1,3..10] â [1,3,5,7,9] [2,3,5,7,11..100] â ! ! [10,9..1] â [10,9,8,7,6,5,4,3,2,1]
è¡
Haskellã§ã¯ãæååã¯
Char
ãªã¹ãã§ãã
'a' :: Char "a" :: [Char] "" â [] "ab" â ['a','b'] â 'a':"b" â 'a':['b'] â 'a':'b':[] "abc" â "ab"++"c"
泚 ïŒ
å®éã®ã¿ã¹ã¯ã§ã¯ãæåã®ãªã¹ãã䜿çšããŠããã¹ããæäœããŸããã
ã»ãšãã©ã®å Žåã Data.Text
ããã«äœ¿çšãããŸãã
ASCIIæåã®ã¹ããªãŒã ãæäœããå¿
èŠãããå Žåã¯ã Data.ByteString
ã䜿çšããå¿
èŠããããŸãã
ã¿ãã«
次ã®ããã«ãã¢ãæå®ã§ããŸã
(a,b)
ã
ã¿ãã«ã®èŠçŽ ã«ã¯ããŸããŸãªã¿ã€ãããããŸãã
æ¬åŒ§ãæ±ããŸã
äœåãªè§ãã£ããåãé€ãã«ã¯ããããã®é¢æ°
($)
ãš
(.)
䜿çšã§ããŸãã
01_basic / 20_Essential_Haskell / 10a_Functions.lhs颿°ãæžãã®ã«åœ¹ç«ã€ããš
ã¡ãã£ãšããæ³šæïŒ
x :: Int â x Int x :: a â x x :: Num a => a â x a, Num f :: a -> b â f a b f :: a -> b -> c â f , a (bâc) f :: (a -> b) -> c â f , (aâb) c
å®çŸ©ããåã«é¢æ°åã宣èšããã®ã¯ãªãã·ã§ã³ã§ãã
Haskellèªäœãæãäžè¬çãªã¿ã€ããæšæž¬ããŸãã
ãã ãã颿°ã®ã¿ã€ããæå®ããã®ã¯çµéšåã§ãã
äžçœ®ãšã³ã㪠square :: Num a => a -> a square x = x^2
^
äžçœ®èšæ³ã§äœ¿çšãããããšã«æ³šæããŠãã ããã
åäžçœ®æŒç®åã«ã¯ãæ¥é èŸãæžãå¯èœæ§ããããŸãã
ç®çã®æŒç®åãè§ãã£ãã§å²ãã ãã§ãã
square' x = (^) x 2 square'' x = (^2) x
åŒã®å·ŠåŽãšå³åŽãã
x
ãåé€ã§ããŸãïŒ
ããã¯ãÎ·åæžãšåŒã°ããŸãã
square''' = (^2)
颿°åã«
'
æåã䜿çšã§ããããšã«æ³šæããŠãã ããã
äŸïŒ
square
â square'
â square''
â square '''
ãã¹ã absolute :: (Ord a, Num a) => a -> a absolute x = if x >= 0 then x else -x
泚ïŒHaskellã®
if .. then .. else
ã¯ãæŒç®åã«äŒŒãŠããŸã
€?€:€
C.
else
ã¯çç¥ã§ããŸã
else
ã
ä»ã®åçã®æ©èœïŒ
absolute' x | x >= 0 = x | otherwise = -x
泚ïŒHaskellããã°ã©ã ã§ã¯ã¢ã©ã€ã¡ã³ããéèŠã§ãã
Pythonã®å Žåãšåæ§ã«ããã¹ã¢ã©ã€ã¡ã³ãã¯ã³ãŒããç Žå£ããå¯èœæ§ããããŸãïŒ
é£ããéšå
è€éãªéšåã®ç ç©¶ã«é²ã¿ãŸãã
æ©èœçãªã¹ã¿ã€ã«

ãã®ã»ã¯ã·ã§ã³ã§ã¯ãHaskellã®é©ãã¹ãã³ãŒããªãã¡ã¯ã¿ãªã³ã°æ©èœã®å°ããªäŸã玹ä»ããŸãã
åé¡ãéžæããæšæºã®åœä»€çãªæ¹æ³ã§è§£æ±ºããŸãã æ¬¡ã«ããã®ã³ãŒããå°ãæ¹åãå§ããŸãã æçµçµæã¯ãã¯ããã«çè§£ããããããããšã¬ã¬ã³ãã«ãªããŸãã
解決ããåé¡ã®ç¶æ
ã¯æ¬¡ã®ãšããã§ãã
æŽæ°ã®ãªã¹ããããå Žåããªã¹ãå
ã®å¶æ°ã®åèšãèšç®ããå¿
èŠããããŸãã
äŸïŒ
[1,2,3,4,5] â 2 + 4 â 6
æ©èœçã¢ãããŒããšåœä»€åã¢ãããŒãã®éãã瀺ãããã«ãæåã«åœä»€åãœãªã¥ãŒã·ã§ã³ãïŒJavascriptã§ïŒèšè¿°ããŸãã
function evenSum(list) { var result = 0; for (var i=0; i< list.length ; i++) { if (list[i] % 2 ==0) { result += list[i]; } } return result; }
ããããHaskellã«ã¯å€æ°ãšã«ãŒãã¯ãããŸããã
ã«ãŒãã䜿çšããªããŠããååž°ã䜿çšããŠåãçµæãåŸãããšãã§ããŸãã
泚 ïŒ
åœä»€åèšèªã®ååž°ã¯ãé
ãããŒã«ã§ãããšããè©å€ããããŸãã ããããã»ãšãã©ã®æ©èœèšèªã§ã¯ããã§ã¯ãããŸããã ã»ãšãã©ã®å ŽåãHaskellã¯éåžžã«é«å質ã§ååž°é¢æ°ã䜿çšããŠäœæ¥ãæé©åããŸãã
C
èšè¿°ãããååž°é¢æ°ã®ããŒãžã§ã³ã次ã«ç€ºããŸã
C
ç°¡åã«ããããã«ãæ°åã®ãªã¹ãããã«å€ã§çµãããšä»®å®ããŸãã
int evenSum(int *list) { return accumSum(0,list); } int accumSum(int n, int *list) { int x; int *xs; if (*list == 0) {
ãã®ã³ãŒããããèŠãŠãã ããã Haskellã«ç¿»èš³ããããã§ãã
ããããæåã«ã䜿çšãã3ã€ã®ã·ã³ãã«ã ãéåžžã«äŸ¿å©ãªé¢æ°ã玹ä»ããŸãã
even :: Integral a => a -> Bool head :: [a] -> a tail :: [a] -> [a]
even
ããªãã£ãã§ãã¯ã
even :: Integral a => a -> Bool even 3 â False even 2 â True
head
ã¯ãªã¹ãã®æåã®èŠçŽ ãè¿ããŸãïŒ
head :: [a] -> a head [1,2,3] â 1 head [] â ERROR
tail
ã¯ãæåã®ãªã¹ãã«å ããŠããªã¹ãã®ãã¹ãŠã®èŠçŽ ãè¿ããŸãã
tail :: [a] -> [a] tail [1,2,3] â [2,3] tail [3] â [] tail [] â ERROR
空ã§ãªããªã¹ã
l
ã
l â (head l):(tail l)
02_Hard_Part / 11_Functions.lhsã ãããHaskellã®åé¡ã«å¯Ÿããæåã®è§£æ±ºçã
evenSum
颿°ã¯ããªã¹ãå
ã®ãã¹ãŠã®å¶æ°ã®åèšãè¿ããŸãã
颿°ããã¹ãããã«ã¯ã
ghci
å®è¡ããã ã
ghci
ïŒ
% ghci GHCi, version 7.0.3: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer-gmp ... linking ... done. Loading package base ... linking ... done. Prelude> :load 11_Functions.lhs [1 of 1] Compiling Main ( 11_Functions.lhs, interpreted ) Ok, modules loaded: Main. *Main> evenSum [1..5] 6
以äžã¯ã颿°ãã©ã®ããã«æ©èœãããã®äŸã§ãïŒç§ã¯ããŸãããŠããŸããç¥ã£ãŠããŸããåŸã§ã«ãŒãºã³ã³ãã¥ãŒãã£ã³ã°ã®åé¡ã«æ»ããŸãïŒã
*Main> evenSum [1..5] accumSum 0 [1,2,3,4,5] 1 is odd accumSum 0 [2,3,4,5] 2 is even accumSum (0+2) [3,4,5] 3 is odd accumSum (0+2) [4,5] 4 is even accumSum (0+2+4) [5] 5 is odd accumSum (0+2+4) [] l == [] 0+2+4 0+6 6
åœä»€åèšèªã®èгç¹ããã¯ããã¹ãŠãæ£åžžã«èŠããŸãã ããããæ¹åã®äœå°ã¯ãããããããŸãã æå§ãã«ãåãããäžè¬çã«ããããšãã§ããŸãã
evenSum :: Integral a => [a] -> a
02_Hard_Part / 11_Functions.lhs
02_Hard_Part / 12_Functions.lhs次ã®ã¹ãããã¯ã
where
ãŸãã¯
let
å®çŸ©ããããã¹ãããã颿°ã䜿çšãã
let
ã§ãã
ãããã£ãŠã
accumSum
颿°
accumSum
ã°ããŒãã«åå空éãæ±æããŸããã
02_Hard_Part / 12_Functions.lhs
02_Hard_Part / 13_Functions.lhs次ã«ããã¿ãŒã³ãããã³ã°ã䜿çšããŸãã
ãã¿ãŒã³ãããã³ã°ãšã¯ ååä»ããã©ã¡ãŒã¿ãŒã®ä»£ããã«å€ã䜿çšããã ãã§ãã ïŒæã倧èãªå Žåã¯ããã¿ãŒã³ãããã³ã°ã®è©³çްãªèª¬æã
ããã§èª¿ã¹ãããšãã§ã
ãŸã ïŒ
ãã®ã³ãŒãã®ä»£ããã«ïŒ
foo l = if l == [] then <x> else <y>
ããªãã¯ç°¡åã«æžãããšãã§ããŸãïŒ
foo [] = <x> foo l = <y>
ãã ãããµã³ãã«ãšã®æ¯èŒã§ã¯ããã«å€ãã®ããšãã§ããŸãã è€éãªæ§é ã®å
éšããŒã¿ãåæã§ããŸãã 亀æã§ããŸã
foo l = let x = head l xs = tail l in if even x then foo (n+x) xs else foo n xs
ã«
foo (x:xs) = if even x then foo (n+x) xs else foo n xs
éåžžã«äŸ¿å©ãªæ©èœã
ããã«ãããã³ãŒããããç°¡æœã§èªã¿ããããªããŸãã
02_Hard_Part / 13_Functions.lhs
02_Hard_Part / 14_Functions.lhsη-reductionã䜿çšãããšãHaskellã§é¢æ°ã®èšè¿°ãç°¡åã«ã§ããŸãã
ããšãã°ããã®ãããªãšã³ããªã®ä»£ããã«ïŒ
fx = (- ) x
䜿çšã§ããŸã
f = -
ãã®ã¢ãããŒãã䜿çšããŠ
l
ãåãé€ãããšãã§ããŸãã
02_Hard_Part / 14_Functions.lhs
02_Hard_Part / 15_Functions.lhsé«é颿°

颿°ãããã«çŸããããããã«ãFEPïŒé«é颿°ïŒã䜿çšã§ããŸãã
ã©ã®ãããªåç©ãå°ããŸããïŒ
é«é颿°ã¯ã颿°ããã©ã¡ãŒã¿ãŒãšããŠãšã颿°ã§ãã
ããã€ãã®äŸïŒ
filter :: (a -> Bool) -> [a] -> [a] map :: (a -> b) -> [a] -> [b] foldl :: (a -> b -> a) -> a -> [b] -> a
ç§ãã¡ã¯å°ããã€åé²ããŸãã
ã©ãã§
filter even [1..10] â [2,4,6,8,10]
filter
颿°ã¯ãåŒæ°ãšããŠåïŒ
a -> Bool
ïŒã®é¢æ°ãšå
[a]
ãªã¹ããåããŸãã 颿°ã
true
ãè¿ããèŠçŽ ã®ã¿ãå«ããªã¹ããè¿ã
true
ã
次ã®ã¹ãããã¯ããµã€ã¯ã«ãããã«ç°¡çŽ åããããšã§ãã å€ã环ç©ã§ãã
foldl
颿°ã䜿çšããŸãã
foldl
颿°ã¯ãäžè¬çãªããã°ã©ãã³ã°ææ³ãå®è£
ããŸãã
myfunc list = foo initialValue list foo accumulated [] = accumulated foo tmpValue (x:xs) = foo (bar tmpValue x) xs
äžèšã®ã³ãŒãã¯æ¬¡ã®ãã®ã«çœ®ãæããããšãã§ããŸãã
myfunc list = foldl bar initialValue list
ããªããæ¬åœã«éæ³ãèµ·ãã£ãŠããããçè§£ãããå Žåã¯ã
foldl
å®è£
foldl
以äžã«ç€ºããŸãã
foldl fz [] = z foldl fz (x:xs) = foldl f (fzx) xs
foldl fz [x1,...xn] â f (... (f (fz x1) x2) ...) xn
ããããHaskellã¯é
å»¶èšèªã§ãããããå€
(fzx)
èšç®ãã
(fzx)
ã¹ã¿ãã¯ã«ããã·ã¥ããŸãã
ãããã£ãŠã
foldl'
代ããã«
foldl
foldl'
ã䜿çšããŸãã
foldl'
ã¯ã
å³å¯ãªïŒãŸãã¯ç²ŸåçãªïŒ foldl
å®è£
ã§ãã
é
延颿°ãšå³å¯é¢æ°ã®éããæããã§ãªãå Žåã¯ãäž¡æ¹ã®é¢æ°ãåãã§ããããšãèæ
®ããŠãã³ãŒããèªãã§ãã ããã
ããã§ã
evenSum
ããŒãžã§ã³ã¯æ¬¡ã®ããã«ãªããŸãã
ãã®ã³ãŒãã¯ãã©ã ãåŒã䜿çšããããšã§ããã«ç°¡åã«ãªããäžæçãª
mysum
èå¥åã
mysum
ãŸãã
ãããŠãã¡ãããæ¬¡ã®äº€æãè¡ãããšãã§ããŸã (\xy -> x+y) â (+)
02_Hard_Part / 15_Functions.lhs
02_Hard_Part / 16_Functions.lhsæåŸã«
foldl'
æãçŽæçãªæ©èœã§ã¯ãããŸãããããããããã¯ééããªã察åŠãã䟡å€ããããŸãããããè¡ãããã«ã段éçãªåæãå®è¡ããŸãã evenSum [1,2,3,4] â foldl' (+) 0 (filter even [1,2,3,4]) â foldl' (+) 0 [2,4] â foldl' (+) (0+2) [4] â foldl' (+) 2 [4] â foldl' (+) (2+4) [] â foldl' (+) 6 [] â 6
å¥ã®æçšãªé«é颿°ã¯ãã(.)
ã§ãããã®é¢æ°(.)
ã¯ãæ°åŠçãªæ§æã«å¯Ÿå¿ããŠããŸãã (f . g . h) x â f ( g (hx))
ããã䜿çšããŠã颿°ãããã«Î·åæžã§ããŸãã
ã³ãŒãããããã«ããããã«äœãä»ã®ããšãã§ããŸãïŒ
çµæã«ã€ããŠè°è«ããŸããé«é颿°ãé©çšããããšã§äœãåŸãããŸãããïŒã³ãŒãã®ç°¡æœããç®ãåŒããŸããããããäž»ãªãã©ã¹ã¯ãããã°ã©ã ãçè§£ããããšãã©ãã»ã©ç°¡åã«ãªã£ããã§ãã颿°ãå°ã倿ŽããããšããŸããããããã§ããªã¹ãå
ã®ãã¹ãŠã®å¶æ°ã®å¹³æ¹åãè¿ãããã«åœŒå¥³ã«æ±ããŠããŸãã [1,2,3,4] â· [1,4,9,16] â· [4,16] â· 20
ãã®å€æŽãããŒãžã§ã³10ã«è¿œå ããã®ã¯éåžžã«ç°¡åã§ãã squareEvenSum = sum' . (filter even) . (map (^2)) squareEvenSum' = evenSum . (map (^2)) squareEvenSum'' = sum' . (map (^2)) . (filter even)
å¥ã®ã倿颿°ãã远å ããã ãã§ãïŒsquareEvenSum''
ä»ã®2ã€ã®å®è£
ãããå¹ççã§ããããšã«æ³šæããŠãã ãããé åºã¯(.)
æ¬åœã«éèŠã§ãïŒã map (^2) [1,2,3,4] â [1,4,9,16]
ãã®é¢æ°map
ã¯ããã©ã¡ãŒã¿ãŒé¢æ°ããªã¹ãã®ãã¹ãŠã®èŠçŽ ã«é©çšããã ãã§ãã颿°å®çŸ©å
ã§äœãã倿Žããå¿
èŠã¯ãããŸãããã¯ããã«ã¢ãžã¥ãŒã«åãããŠããŸãããããããšãããã圌女ã¯ãããæ°åŠçã«ãæ¯ãèãå§ããŸãããä»ã®é¢æ°ãšåãããã«é¢æ°ã䜿çšã§ããŸããæ°ããæ©èœã䜿çšããŠãæ§æãããããæãç³ã¿ãããã³ãã£ã«ã¿ãŒãå®è¡ã§ããŸãã1ã€ã®ããŒãžã§ã³ã®ãªãã¡ã¯ã¿ãªã³ã°ãã¿ã¹ã¯ãšããŠèªè
ã«ä»»ããŸããããšãã°ããã®é¢æ°ã¯ãªã¹ãã ãã§ãªãååž°åã«ã䜿çšã§ããŸããæ¹æ³ã«èå³ãããå Žå-ãã®æ¥œããèšäºãèªãã§ãã ããïŒMeijerãFokkingaãPatersonã«ããããããã¬ã³ãºããšã³ãããŒããæåºéç·ã«ãã颿°åããã°ã©ãã³ã°ããã®äŸã§ã¯ã颿°åããã°ã©ãã³ã°ãã©ãã»ã©åŒ·åã§ããããããããŸããæ®å¿µãªãããå Žåã«ãã£ãŠã¯ãçŽç²ã«æ©èœçãªèšèªãåžžã«æè¯ã®éžæãšã¯éããŸãããå°ãªããšããçã«æ®éçãªé¢æ°åèšèªã¯ãŸã äœæãããŠããŸãããHaskellã®éç«ã£ãç¹åŸŽã®1ã€ã¯ãDSLïŒãã¡ã€ã³æåèšèªïŒã®äœæã«ãããŸããå®éãåœä»€åã®ããã°ã©ã ãäœæãããå Žåã§ããHaskellã¯åªããããŒã«ã§ããHaskellãç ç©¶ãããšãããã®èãã¯ç§ã«ãšã£ãŠå瀺ã§ãããããããHaskellã®è¶
倧åœã«ã€ããŠè©±ãããåã«ããã1ã€ã®éèŠãªåŽé¢- ã¿ã€ã ãçš®é¡

tl; drïŒ
type Name = AnotherType
ããã¯åã«ãã³ã³ãã€ã©ã®çš®é¡ã®å¥åã§ããName
ãšAnotherType
åãããã«èŠããŸããdata Name = NameConstructor AnotherType
ãã®äŸã§ã¯ãã¿ã€ããç°ãªããŸããdata
ååž°æ§é ãäœæã§ããŸããderiving
ããã¯åŒ·åãªéè¡ã§ãããããªãã®ããã®æ©èœãäœæã§ããŸãã
Haskellã¯ã匷åãªéçåä»ããåããèšèªã§ãããªãããããããªã«éèŠãªã®ã§ããïŒ
ãšã©ãŒã®æ°ã倧å¹
ã«æžããããã§ããHaskellã§ã¯ãã»ãšãã©ã®ãšã©ãŒã¯ã³ã³ãã€ã«æ®µéã§æ€åºã§ããŸããããã¯ãã³ã³ãã€ã«äžã«åã®ã³ã³ãã€ã«ãç©æ¥µçã«äœ¿çšãããããã«çºçããŸããééã£ãå Žæã§ééã£ããã©ã¡ãŒã¿ãŒã䜿çšãããšãã³ã³ãã€ã©ãŒã¯ç°¡åã«ããã«æ°ä»ãã§ããããåæšè«
é«éããã°ã©ã ãäœæããã«ã¯éçåä»ããå¿
èŠã§ãããã»ãšãã©ã®éçåä»ãèšèªã¯æŠå¿µãäžè¬åããã®ã«åŒ±ãã§ããHaskellã®åªããèœåã®1ã€ã¯åæšè«ã§ããç°¡åãªäŸã
square
Haskell 颿°ïŒ square x = x * x
ãã®é¢æ°ã¯square
ãæ°å€åã®ä»»æã®å€ãïŒå¹³æ¹ïŒã§ããŸããããªãã¯ã«å€åãæž¡ãããšãã§ãInt
ãInteger
ãFloat
ãFractional
ãšããComplex
ãäŸïŒ
% ghci GHCi, version 7.0.4: ... Prelude> let square x = x*x Prelude> square 2 4 Prelude> square 2.1 4.41 Prelude>
x :+ y
ããã¯ãè€çŽ æ°ïŒx + iyïŒã®è¡šèšã§ããæ¬¡ã«ãCããã°ã©ã ãšæ¯èŒããã³ãŒãã®éãæ¯èŒããŸãã int int_square(int x) { return x*x; } float float_square(float x) {return x*x; } complex complex_square (complex z) { complex tmp; tmp.real = z.real * z.real - z.img * z.img; tmp.img = 2 * z.img * z.real; } complex x,y; y = complex_square(x);
ã¿ã€ãããšã«ãç¬èªã®é¢æ°ãäœæããå¿
èŠããããŸãããããåé¿ããã«ã¯ãã¡ã¿ããã°ã©ãã³ã°ææ³ã䜿çšããå¿
èŠããããŸããããšãã°ãããªããã»ããµã䜿çšããŸããC ++ã¯ããã³ãã¬ãŒãã䜿çšããããçŸãããœãªã¥ãŒã·ã§ã³ãæäŸããŸãã #include <iostream> #include <complex> using namespace std; template<typename T> T square(T x) { return x*x; } int main() { // int int sqr_of_five = square(5); cout << sqr_of_five << endl; // double cout << (double)square(5.3) << endl; // complex cout << square( complex<double>(5,3) ) << endl; return 0; }
C ++ããªã¢ã³ãã¯Cãããæ Œæ®µã«åªããŠããŸããããããè€éãªå€æ°ã®é¢æ°ã®å Žåãåãæ§æãç¶æããããšã¯å°é£ã§ãããã®èšäºã®äŸãã芧ãã ãããã
C ++ã§ã¯ãããŸããŸãªåã§æ©èœãã颿°ãèšè¿°ããå¿
èŠããããŸããHaskellã§ã¯ãç¶æ³ã¯éã§ãã颿°ã¯ããã©ã«ãã§å¯èœãªéãäžè¬åãããŸããHaskellåæšè«ã¯ãåçã«åä»ããããèšèªã衚ãèªç±æãäžããŸããããããåçã«åä»ããããèšèªãšã¯ç°ãªããã»ãšãã©ã®ãšã©ãŒã¯ããã°ã©ã ãå®è¡ãããåã§ããã£ãããããŸãã人ã
ã¯ãã®ããã«Haskellã«ã€ããŠè©±ããŸãïŒãã³ã³ãã€ã«ãããå Žåãã»ãšãã©ã®å Žåæ£ããåäœããŸãã
02_Hard_Part / 21_Types.lhsæ°ããã¿ã€ãã®äœæ
ç¬èªã®ã¿ã€ããäœæã§ããŸããããšãã°ãåã·ããã ã宣èšã§ããŸãã type Name = String type Color = String showInfos :: Name -> Color -> String showInfos name color = "Name: " ++ name ++ ", Color: " ++ color name :: Name name = "Robin" color :: Color color = "Blue" main = putStrLn $ showInfos name color
ããããããã¯ééãããããªããä¿è·ãããã®ã§ã¯ãããŸããã颿°ã®2ã€ã®ãã©ã¡ãŒã¿ãŒã亀æããŠshowInfos
ãããã°ã©ã ãå®è¡ããŠã¿ãŠãã ããã putStrLn $ showInfos color name
ã³ã³ãã€ã«ããŠå®è¡ããŸããNameãColorãããã³Stringã亀æå¯èœãªãšã³ãã£ãã£ãšããŠäœ¿çšã§ããŸããã³ã³ãã€ã©ãŒã«ãšã£ãŠã¯ããŸã£ããåãã§ããç¬èªã®ã¿ã€ããäœæããå¥ã®æ¹æ³ã¯ãããŒã¯ãŒãã䜿çšããããšdata
ã§ãã data Name = NameConstr String data Color = ColorConstr String showInfos :: Name -> Color -> String showInfos (NameConstr name) (ColorConstr color) = "Name: " ++ name ++ ", Color: " ++ color name = NameConstr "Robin" color = ColorConstr "Blue" main = putStrLn $ showInfos name color
showInfos
ãã©ã¡ãŒã¿ãŒã亀æãããšãã³ã³ãã€ã©ãŒã¯èªãå§ããŸããééããç¯ãæ©äŒã¯ãªããªããŸããããã ããã³ãŒãã®éãå¢ããããšã¯ç ç²ã«ãªããŸããåã³ã³ã¹ãã©ã¯ã¿ã¯é¢æ°ã§ããããšã«æ³šæããŠãã ããã NameConstr :: String -> Name ColorConstr :: String -> Color
data
éåžžãäœ¿çšæ¹æ³ã¯æ¬¡ã®ããã«ãªããŸãã data TypeName = ConstructorName [types] | ConstructorName2 [types] | ...
ã®ããã«
DataTypeNameãšDataTypeConstructorã¯éåžžåãååã䜿çšããŸããäŸïŒ
data Complex = Num a => Complex aa
ãšã³ããªã®æ§æã䜿çšããããšãã§ããŸãã data DataTypeName = DataConstructor { field1 :: [type of field1] , field2 :: [type of field2] ... , fieldn :: [type of fieldn] }
ãŸãã倿°ã®ããŒã¿ã¢ã¯ã»ã¹é¢æ°ãèªåçã«äœæãããŸããããã«ãæ°ããå€ãæžã蟌ããšããä»»æã®é åºã®ãã£ãŒã«ãã䜿çšã§ããŸããäŸïŒ
data Complex = Num a => Complex { real :: a, img :: a} c = Complex 1.0 2.0 z = Complex { real = 3, img = 4 } real c â 1.0 img z â 4
02_Hard_Part / 22_Types.lhs
02_Hard_Part / 23_Types.lhsååž°å
ãªã¹ãã䜿çšããŠãååž°åã®ä»£è¡šè
ãšæ¢ã«äŒã£ãŠããŸããããè©³çŽ°ãªæ§æã䜿çšããŠããªã¹ããæåããäœæã§ããŸãã data List a = Empty | Cons a (List a)
èšé²ãç°¡åã«ããããã«ãäžçœ®åã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšã§ããŸãã infixr 5 ::: data List a = Nil | a ::: (List a)
åŸã®æ°åinfixr
ã¯ããªãã¬ãŒã¿ãŒã®åªå
é äœã§ããæ°ããã¿ã€ãã®å€ãå°å·ïŒShow
ïŒãèªã¿åãïŒRead
ïŒããã§ãã¯ïŒEq
ïŒãæ¯èŒïŒOrd
ïŒããå Žåãå¿
èŠãªé¢æ°ãèªåçã«å°å·ããããã«Haskellã«æç€ºã§ããŸãã infixr 5 ::: data List a = Nil | a ::: (List a) deriving (Show,Read,Eq,Ord)
deriving (Show)
ã¿ã€ãã®èª¬æã«è¿œå ãããšãHaskellã¯èªåçã«é¢æ°ãäœæããŸãshow
ãããã«ããªãã®é¢æ°ã®ããŒãžã§ã³ãæžãæ¹æ³ãèŠãã§ãããshow
ã convertList [] = Nil convertList (x:xs) = x ::: convertList xs
main = do print (0 ::: 1 ::: Nil) print (convertList [0,1])
ããã°ã©ã åºåïŒ
0 ::: (1 ::: Nil) 0 ::: (1 ::: Nil)
02_Hard_Part / 23_Types.lhs
02_Hard_Part / 30_Trees.lhsæšã
ãã1ã€ã®æšæºçãªäŸã次ã«ç€ºããŸãããã€ããªããªãŒã import Data.List data BinTree a = Empty | Node a (BinTree a) (BinTree a) deriving (Show)
ãªã¹ããé åºä»ãäºåæšã«å€æãã颿°ãæžããŸãããã treeFromList :: (Ord a) => [a] -> BinTree a treeFromList [] = Empty treeFromList (x:xs) = Node x (treeFromList (filter (<x) xs)) (treeFromList (filter (>x) xs))
ãã®æ©èœã®åªé
ãããæ¥œãã¿ãã ããããã·ã¢èªãžã®ç¿»èš³ïŒ- 空ã®ãªã¹ãã¯ç©ºã®ããªãŒã«å€ãããŸãã
- ãªã¹ã
(x:xs)
ã¯æ¬¡ã®ãããªããªãŒã«ãªããŸãã
- ã«ãŒãã¯
x
- å·Šã®ãµãããªãŒããªã¹ãã«äœæããã
xs
å³å¯ã«å°ãããx
ã〠xs
å³å¯ã«å€§ãããªã¹ãèŠçŽ ããæ£ãããµãããªãŒãäœæããx
ãŸãã
main = print $ treeFromList [7,2,4,8]
次ã®ãããªãã®ãåŸãããã¯ãã§ãã
Node 7 (Node 2 Empty (Node 4 Empty Empty)) (Node 8 Empty Empty)
ããã¯æçã§ãããç§ãã¡ã®ããªãŒãããŸãçŸãã衚çŸããŠããŸããã02_Hard_Part / 30_Trees.lhs
02_Hard_Part / 31_Trees.lhs楜ããæéãéããããã«ãããªãŒãããçŸãã衚瀺ããããã®ã³ãŒããæžããŸããããã©ããªæšã§ãããŸã衚瀺ã§ãã颿°ãæžãã®ã¯æ¬åœã«æ¥œããã£ãã§ãããã®éšåãé£ãããšæãããå Žåã¯ãå®å
šã«ã¹ãããã§ããŸããå°ããªå€æŽãå ããå¿
èŠããããŸããå宣èšããåé€deriving (Show)
ãBinTree
ãŸãã BinTreeãåã¯ã©ã¹ïŒEq
ããã³Ord
ïŒã®ã€ã³ã¹ã¿ã³ã¹ã«ããããšã圹ç«ã¡ãŸããããã«ãããããªãŒã®ç䟡æ§ããã¹ãããæ¯èŒããæ©äŒãåŸãããŸãã data BinTree a = Empty | Node a (BinTree a) (BinTree a) deriving (Eq,Ord)
ãªãã§ã¯deriving (Show)
ãHaskellã¯ç§ãã¡ã®ããã®ã¡ãœãããäœæããŸããshow
ããã ããç¬èªã®ããŒãžã§ã³ãäœæããŸãshow
ããããè¡ãã«BinTree a
ã¯ãæ°ããäœæãããåãåclassã®ã€ã³ã¹ã¿ã³ã¹ã§ããããšã瀺ãå¿
èŠããããŸãShow
ãã³ãŒãã§ã¯ã次ã®ããã«ãªããŸãã instance Show (BinTree a) where show t = ...
ããã«ããã€ããªããªãŒã衚瀺ããç§ã®ããŒãžã§ã³ããããŸããèŠãç®ã»ã©æããªãã®ã§ããã£ãšå¥åŠãªãªããžã§ã¯ãã衚瀺ããããã«èª¿æŽããŸããã
ã¡ãœããtreeFromList
ã¯å€æŽãããŸããã treeFromList :: (Ord a) => [a] -> BinTree a treeFromList [] = Empty treeFromList (x:xs) = Node x (treeFromList (filter (<x) xs)) (treeFromList (filter (>x) xs))
ãããŠä»ãç§ãã¡ã¯éã¶ããšãã§ããŸãïŒ main = do putStrLn "Int binary tree:" print $ treeFromList [7,2,4,8,1,3,6,21,12,23]
print $ treeFromList [7,2,4,8,1,3,6,21,12,23] Int binary tree: < 7 : |
ã¯ããã«è¯ãïŒããªãŒã®ã«ãŒãã¯ãã·ã³ãã«ãšãšãã«è¡šç€ºãããŸã<
ããããŠãåŸç¶ã®åè¡ã¯ã§å§ãŸããŸã:
ããã ããå¥ã®ã¿ã€ãã䜿çšã§ããŸãã putStrLn "\nString binary tree:" print $ treeFromList ["foo","bar","baz","gor","yog"]
String binary tree: < "foo" : |
ãŸããããªãŒã®ç䟡æ§ããã¹ãããŠé åºãèšå®ã§ãããããããªãŒããªãŒãäœæã§ããŸãã putStrLn "\n :" print ( treeFromList (map treeFromList ["baz","zara","bar"]))
: < < 'b' : : |
ããããåæ°ããè¡ã®ãã¬ãã£ãã¯ã¹ãšããŠïŒã«ãŒããé€ãïŒãéžæããçç±:
ã§ãã
putStrLn "\nTree of Binary trees of Char binary trees:" print $ (treeFromList . map (treeFromList . map treeFromList)) [ ["YO","DAWG"] , ["I","HEARD"] , ["I","HEARD"] , ["YOU","LIKE","TREES"] ]
ããã¯ä»¥äžãšåçã§ãïŒ print ( treeFromList ( map treeFromList [ map treeFromList ["YO","DAWG"] , map treeFromList ["I","HEARD"] , map treeFromList ["I","HEARD"] , map treeFromList ["YOU","LIKE","TREES"] ]))
çµæãšããŠïŒ Binary tree of Binary trees of Char binary trees: < < < 'Y' : : : `
éè€ã¯æ¿å
¥ãããªãããšã«æ³šæããŠãã ããã察å¿ãã1ã€ã®ããªãŒã®ã¿ã衚瀺ãããŸã"I","HEARD"
ãTreeãã€ã³ã¹ã¿ã³ã¹ãšå®£èšããããããã®æ©äŒã¯ïŒã»ãŒïŒç¡æã§åŸãããŸããEq
ããã®ã¿ã€ãã®çŸãããšåãèŠãŠãã ãããæ°åãç·ãèšå·ã ãã§ãªããä»ã®ããªãŒã§æ§æãããããªãŒãäœæã§ããŸããèŠçŽ ãããªãŒããªãŒã§ããããªãŒãäœæããããšãã§ããŸãïŒ02_Hard_Part / 31_Trees.lhs
02_Hard_Part / 40_Infinites_Structures.lhsç¡éã®æ§é
Haskellã¯ãã°ãã°æ zyãªèšèªãšåŒã°ããŸããããããHaskellã¯å³å¯ãªèšèªã§ã¯ãªããšèšãã®ã¯æ£ããããšã§ããæ azineã¯ãå³å¯ã§ã¯ãªãèšèªã®äžè¬çãªå®è£
ã§ããç·©ãèšèªãšã¯äœã§ããïŒHaskell-wikiããïŒãªãã¯ã·ã§ã³ïŒåŒãèšç®ããããã®æ°åŠçšèªïŒã¯ãå€åŽããå
åŽã«é²ã¿ãŸãã
åŒãããå Žåã¯ã(a+(b*c))
æå+
ã«è©äŸ¡ããæ¬¡ã«å
éšåŒ(b*c)
ããšãã°ãHaskellã䜿çšãããšã次ã®ããšãã§ããŸãã
ãããŠãããã°ã©ã ã¯çµäºããŸããã©ããã£ãŠïŒ
ãã¹ãŠãèšç®ãã代ããã«
ãå¿
èŠãªèŠçŽ ã®ã¿ãèšç®ããŸããHaskellã§ç¡éãªã¹ããæå®ããæ§æã«æ³šæããŠãã ãã [1..] â [1,2,3,4...] [1,3..] â [1,3,5,7,9,11...]
ãããŠãã»ãšãã©ã®æ©èœã¯ãã®ãããªãªã¹ããæ±ãããšãã§ããŸããtake
ç§ãã¡ã®ãã®ãšåäžã®æšæºæ©èœããããtake'
ãŸãã02_Hard_Part / 40_Infinites_Structures.lhs
02_Hard_Part / 41_Infinites_Structures.lhsé åºä»ããããäºåæšãæã€ããšãæ°ã«ããªããšããŸããããç¡éãã€ããªããªãŒã®äŸã次ã«ç€ºããŸãã nullTree = Node 0 nullTree nullTree
åããŒãã«ãŒããããå®å
šãªäºåæšã次ã®é¢æ°ã䜿çšããŠãã®ããªãŒãæäœã§ããããšã蚌æããŸãã
ãã®ããã°ã©ã ãåºåãããã®ãèŠãŠã¿ãŸãããïŒ main = print $ treeTakeDepth 4 nullTree
ãã®ã³ãŒãã¯ã次ã®çµæãã³ã³ãã€ã«ãéå§ã忢ã衚瀺ããŸãã < 0 : |
ãã¥ãŒãã³ãå°ãæºããã«ã¯ãããªãŒãããå¥åŠã«ããŸãã iTree = Node 0 (dec iTree) (inc iTree) where dec (Node xlr) = Node (x-1) (dec l) (dec r) inc (Node xlr) = Node (x+1) (inc l) (inc r)
åæ§ã®ããªãŒã¯ã髿¬¡é¢æ°ã䜿çšããŠäœæããããšãã§ããŸãããã®é¢æ°ã¯ã«äŒŒãŠmap
ãBinTree
ãŸããããªã¹ãã®ä»£ããã«æ©èœããã¯ãã§ãããã®ãããªé¢æ°ã®å¯èœãªå®è£
ã®1ã€ã次ã«ç€ºããŸãã
ãã³ãïŒãã®ãããã¯ã«ãã ããããšã¯ãããããŸãããããªããäžè¬åãèŠãŠå¥œå¥å¿æºçã§ããã°map
ä»ã®ããŒã¿æ§é ã«ãããŒã¯ãŒããã¡ã³ã¯ã¿ïŒãã¡ã³ã¯ã¿ïŒãæ€çŽ¢ãfmap
ãç§ãã¡ã®å®è£
ïŒ infTreeTwo :: BinTree Int infTreeTwo = Node 0 (treeMap (\x -> x-1) infTreeTwo) (treeMap (\x -> x+1) infTreeTwo)
ãããŠãå®è¡ã®çµæ main = print $ treeTakeDepth 4 infTreeTwo
< 0 : |
02_Hard_Part / 41_Infinites_Structures.lhs