颿°åè¨èªã§ã®é¢æ°ã«ã¤ãã¦ãHaskell ãç¨ãã¦èª¬æãã¾ãã
颿°ã®å
颿°ã®åã¯ã-> ã使ã£ã¦æ¸ãã¾ããä¾ãã°ãInt ã Char ã«å¤æãã chr ã¨ãã颿°ã®åã¯ã以ä¸ã®ããã«ãªãã¾ãã
chr :: Int -> Char
ä¸å¼æ°ã®é¢æ°ã®åã¯ãã¾ããããªããã ã¨æããã§ããããã³ã£ããããã®ã¯ã弿°ãå¢ããã¨ãã§ãããã¨ãã°ãreplicate ã¨ãã颿°ã®åãè¦ã¦ã¿ã¾ãããã
replicate :: Int -> a -> [a]
replicate ã¯ã第äºå¼æ°ã§æå®ããããã¼ã¿ã第ã¼å¼æ°ã«æå®ãããåæ°åç¨æãã¦ããªã¹ãã«ãã¦è¿ã颿°ã§ãã([] ã¯é åã§ã¯ãªãããªã¹ãã§ãã) 次ã®ããã«åãã¾ãã
> replicate 3 "foo" â ["foo","foo","foo"]
a ã¯å夿°ã¨ãã£ã¦ãä»»æã®åãåãã¾ãããªãããªã人ã¯ãå ·ä½çãªåãå½ã¦ã¯ãã¦ã¿ãã¨ããã§ãããããã¨ãã°ãa ã String ã«åºå®ãã¦ããã¨ã以ä¸ã®ãããªåã«ãªãã¾ãã
replicate :: Int -> String -> [String]
ã³ã£ããããç¹ã¯ã第ä¸å¼æ°ã¨ç¬¬äºå¼æ°ã®éã«ã -> ã使ããã¦ãããã¨ã§ããå½ä»¤åè¨èªã®äººã¯ããããªæãã«æ¸ãã¹ãã ã¨æãã®ã§ã¯ãªãã§ããããï¼ (以ä¸ã®ä¸¸æ¬å¼§ã¯ãã¿ãã«ã¨ããç¡åã®æ§é ä½ã表ãã¾ãã)
replicate :: (Int, String) -> [String]
ãããçè§£ããã«ã¯ãã«ãªã¼åãå¦ã¶å¿ è¦ãããã¾ãã
ã«ãªã¼å
颿°åè¨èªã®é¢æ°ã¯ãã«ãªã¼åã®æ¦å¿µãç¨ããã¦å®ç¾©ããã¦ãã¾ãããã®æå³ããã¨ããã¯ã颿°ãä¸ã¤ã®å¤ãåã£ã¦ä¸ã¤ã®å¤ãè¿ãå½¢ã§å®ç¾©ãããã¨ãããã¨ã§ãã颿°ãä¸ã¤ã®å¼æ°ããåããªããªããã©ããã£ã¦è¤æ°ã®å¼æ°ã渡ãã°ããã®ã§ããããï¼
ãã®çãã¯ã颿°ããå¤ãã®ä»ã«ã颿°ããè¿ããããã«ããã°ããã®ã§ããå®ã¯ã-> ã¨ããè¨å·ã¯ãå³çµåãªã®ã§ä»¥ä¸ã®ããã«æ¬å¼§ãè£ããã¨ãã§ãã¾ãã(以ä¸ã®ä¸¸æ¬å¼§ã¯ãçµååã示ãããã®ä¸¸æ¬å¼§ã§ãã)
replicate :: Int -> (String -> [String])
ããããã°ãreplicate ã®åã®æå³ãã¯ã£ãããã¾ããããªãã¡ãreplicate ã¯ããInt ãåã£ã¦ãString -> [String] ã¨ããåãæã¤é¢æ°ããè¿ã颿°ããªã®ã§ãã
å®éããã¹ã¦ã®å¼æ°ãä¸ããå¿ è¦ã¯ãªããå·¦ã®å¼æ°ã®ããã¤ããä¸ãããã¨ãã§ãã¾ãã
replicate3 :: String -> [String] replicate3 = replicate 3
ä¸é¨ã®å¼æ°ãä¸ãããã¨ããé¨åé©ç¨ãã¨ããã¾ããã«ãªã¼åã®æ¦å¿µãç¨ãã¦å®ç¾©ããã¦ããã®ã§ãæ¬å½ã¯é¨åãããªããã§ãããåå¿è ã«ã¯ããããè¨ãæ¹ãåããæãã®ã§ããã®ç¨èªãã¾ããéã£ã¦ãã¾ãã
ã¯ãã¼ã¸ã£ã®æ¦å¿µãç¥ã£ã¦ãã人ãªãããããã¯ãã¼ã¸ã£ã§ãããã¨ãã¯ã£ããåããã§ãããããã ããã¯ãã¼ã¸ã£å ã®å¤æ°ã¯å¤æ´ã§ãã¾ãããHaskell ã§ã¯ãã¯ãã¼ã¸ã£ãã¯ãã¼ã¸ã£ã¨æèããã«ä½¿ããã¨ãããç´ æ´ãããã®ã§ãã
ã«ãªã¼åããã¦ããï¼
ãã«ãªã¼åãã¨ããç¨èªã¯ãäºã¤ã®æå³ã§ä½¿ããããã¨ãããã®ã§ã注æãå¿ è¦ã§ãã
- 颿°ãã«ãªã¼åã®æ¦å¿µãç¨ãã¦å®ç¾©ããããã¨ãã颿°ãã«ãªã¼åããã¦ãããã¨ãã人ããã¾ãã
- Haskellã§ã®æ¬å½ã®ã«ãªã¼åã¨ã¯ã弿°ã«æ§é ä½ãåã颿°ãã«ãªã¼åã®æ¦å¿µãç¨ãã¦å®ç¾©ãç´ããã¨ã§ãã
追è¨ï¼カリー化談義ãèªãã§ä¸ããã
å¾è ã®æå³ã§ã®ãã«ãªã¼åãå®ç¾ãã颿°ã¯ curry ã¨è¨ãã¾ãã
curry :: ((a, b) -> c) -> a -> b -> c curry f x y = f (x,y)
(a, b) -> c ã®ããã«ã¿ãã«ãåã颿°ã a -> b -> c ã¨ããåãæã¤é¢æ°ã«åå®ç¾©ãã¦ãã¾ããã
ãã®éãããã®ã uncurry ã§ãã
uncurry :: (a -> b -> c) -> (a, b) -> c uncurry f (x,y) = f x y
ç¡å颿°
ç¡å颿°ã¯ãããã¯ã¹ã©ãã·ã¥ã®å¾ã«å¼æ°ãæ¸ãã-> ãç¶ãã¦ããã®å¾ã«æ¬ä½ãæ¸ãã¾ãã
\x -> x + 5
以ä¸ã®ãããªäºå¼æ°ã®é¢æ°(å³å¯ãªäººã«ã¯æããã表ç¾ï¼)ãèãã¾ãããã
calc :: Int -> Int -> Int calc x y = x + y - 1
calc ã®ç¬¬äºå¼æ°ãå³å´ã«ç§»é (ï¼)ããã¨ãããæ¸ãã¾ãã
calc x = \y -> x + y - 1
(å³è¾ºã«ã ãè¦ãã¨ãx ãèªç±å¤æ°ã§ãããã¨ãã¯ã£ããåããã¾ããã) ããã«ã第ä¸å¼æ°ãç§»é ãã¦ã¿ã¾ãããã
calc = \x -> \y -> x + y - 1
ããã§ãã¦ããã¨ãæãã¾ãããï¼
çµå±ã
calc x y = x + y - 1
ã¨ãã颿°å®ç¾©ã®æ¸å¼ã¯ã
calc = \x -> \y -> x + y - 1
ã®æ§æç³è¡£ã«éããªãã®ã§ãã
ãªãããã®å®ç¾©ã¯æ§æç³è¡£ã使ã£ã¦ä»¥ä¸ã®ããã«ãæ¸ãã¾ãã
calc = \x y -> x + y - 1
æ¼ç®åã¨é¢æ°
Haskell ã§ã¯ãäºå¼æ°ã®é¢æ°ãããã¯ã¯ãªã¼ãã§å²ãã¨ãäºé æ¼ç®åã®ããã«çãä¸ã«æ¸ãã¾ãã
ãã¨ãã°ã
isPrefixOf "foo" "foobar"
ã
"foo" `isPrefixOf` "foobar"
ã¨æ¸ãã¾ããè±èªã®èªé ã§èªãã¦ä¾¿å©ã§ããï¼
éã«äºé æ¼ç®åã¯ã丸æ¬å¼§ã§å²ããã¨ã§ã颿°ã®ããã«å é ã«æ¸ããã¨ãã§ãã¾ãã
ãã¨ãã°ã
3 + 4
ã
(+) 3 4
ã¨æ¸ãã¾ãã
ãã¼ã¿æ§æåã¨é¢æ°
Haskell ã§ã®ãã¼ã¿ã¯ä»¥ä¸ã®ããã«å®ç¾©ãã¾ãã
data Maybe a = Nothing | Just a
ããã§ãMaybe ã¯åã®ååã§ããã¾ããNothing ã Just ã¯ããã¼ã¿æ§æåã¨å¼ã°ãã¦ãã¾ãããã¼ã¿ã®ç¨®é¡ã表ãã¿ã°åã ã¨èãã¦ãããã§ãããã
é©ãã¹ããã¨ã«ããã¼ã¿æ§æåã¯é¢æ°ã®ããã«æ±ãã¾ããå®éãJust ã¯ä»¥ä¸ã®ãããªåãæã¡ã¾ãã
Just :: a -> Maybe a
以ä¸ã¯ãJust ããããã颿°ã®ããã«ä½¿ãä¾ã§ãã
> map Just [1,2,3] â [Just 1,Just 2,Just 3]
颿°åæ
ä¸å¼æ°ã®é¢æ°ã¯ãæ¼ç®å(.)ã§åæãããã¨ãã§ãã¾ãã
(.) :: (b -> c) -> (a -> b) -> a -> c (.) f g x = f (g x)
æåã¯åããã«ãããããããªãã®ã§ãé¨åå¼ã®åã調ã¹ã¦ã¿ã¾ãããã
f :: b -> c g :: a -> b x :: a g x :: b f (g x) :: c
åããã¾ãããï¼
(.) ã®åã«ä¸¸æ¬å¼§ãä»ãã¦ã¿ã¾ãããã
(.) :: (b -> c) -> (a -> b) -> (a -> c)
b -> c 㨠a -> b ãåæã㦠a -> c ã¨ããåãæã¤é¢æ°ãè¿ãã¦ããã®ãã¯ã£ããåããã¾ãã
(.) ã®å©ç¨ä¾ã以ä¸ã«ç¤ºãã¾ãã
add1 :: Int -> Int add1 x = x + 1 next :: Char -> Char next = chr . add1 . ord
ord ã¯ãInt -> Char ã¨ããåãæã¤é¢æ°ã§ããããã§ next ã¯ãæåãåãããã®æ¬¡ã®æåãè¿ã颿°ã«ãªãã¾ãã
> next 'a' â 'b'
念ã®ãããããããã®åãæ¸ãã¦ã¿ã¾ãã
ord :: Char -> Int add1 :: Int -> Int chr :: Int -> Char
(.) ãçµåã§ããã®ã¯ãä¸å¼æ°ã®é¢æ°ã ããªã®ã§ãç¨éãçãã¨æã人ãããã§ããããããããHaskell ã®é¢æ°ã¯ãé¨åé©ç¨ã§ãããã¨ãæãåºãã¦ä¸ããããããã§ããä¸å¼æ°ã®é¢æ°ãä½ãåºããã¨ãã§ãã¾ãã(ãããæãããããªèª¬æã ï¼) 以ä¸ã®ä¾ã¯ãããã¯ã£ãããããã¨æãã¾ãã
next :: Char -> Char next = chr . (+) 1 . ord -- æ¼ç®åã颿°ã«ãã¦é¨åé©ç¨
ãã¾ãï¼ä»åã¯ã»ã¯ã·ã§ã³ã説æãã¾ããã§ããããã»ã¯ã·ã§ã³ã使ãã°ã以ä¸ã®ããã«ãæ¸ãã¾ãã
next :: Char -> Char next = ord . (+1) . chr