なぜ関数プログラミングは重要かã§ã¯ãç³ã®éè¦ãã強調ããã¦ãã¾ãã
åé¡ã解ãããã®é¨åããã°ã©ã ãæ¸ãã¨ãããã®åé¡ãé¨ååé¡ã«åå²ããé¨ååé¡ã解ãããã®è§£ãåæãããå ã®åé¡ãåå²ããæ¹æ³ã¯ãé¨å解ãå¼µãåããæ¹æ³ã«ç´æ¥ä¾åãããããããã«ãæ¦å¿µçã«ã¯åé¡ãã¢ã¸ã¥ã¼ã«åããè½åãé«ããããã«ã¯ãã®ããã°ã©ãã³ã°è¨èªã®ãªãã§æ°ããªç³ã®é¡ãç¨æããªããã°ãªããªãã...
ç³ã®éè¦æ§ã¯ã大工ä»äºã¨ã®é¡æ¯ã«ãã£ã¦ãæ£ããè©ä¾¡ã§ãããæ¤ åã¯ãé¨å(座é¨ãèãèããããªã©)ãä½ããããããæ£ãããã£ã¤ãåãããã¨ã§å®¹æã«ä½ããã¨ãã§ãããããããããã¯ã¸ã§ã¤ã³ãã¨æ¨ãå¼µãåããã¨ããè½åã«ä¾åããããã®è½åããªããã°ãæ¤ åãä½ãæ¹æ³ã¯ã²ã¨ã¤æ¨ã®å¡ããããã彫ãåºã以å¤ãªããé常ã«é£ããä½æ¥ã«ãªãããã®ä¾ã¯ãã¢ã¸ã¥ã¼ã«åã®å¼·å¤§ãªåã¨æ£ããç³ãæã¤ãã¨ã®éè¦æ§ã®ä¸¡æ¹ãä¾ç¤ºãããã®ã§ããã
åãæãã« Haskell ã«ã¯ 4 ã¤ã®ç³ãããã¾ãã
- é¢æ°åæ(.)
- é«éé¢æ°
- é 延è©ä¾¡
- ã¢ããã® bind
é¢æ°åæ(.)
é¢æ°åæã使ãã¨ãé¢æ°ãç°¡æ½ã«è¡¨ç¾ã§ãã¾ãã
ä¾ã¨ãã¦ãåèªã®åå¾ã®ç©ºç½ãåã strip ã¨ããé¢æ°ãèãã¦ã¿ã¾ãããã
strip str = fst (break (==' ') (dropWhile (==' ') str))
ãããªé¢¨ã«åãã¾ãã
strip " foo " â "foo"
Lisp ã«æ £ãã¦ããã¨æ¬å¼§ã¯æ°ã«ãªããªããªãã¾ãããHaskell ã«æ £ãã¦ããã¨æ¬å¼§ã ($) ã§ç½®ãæããããã«ãªãã¾ãã
strip str = fst $ break (==' ') $ dropWhile (==' ') str
ããã«æ £ãã¦ãã¨ã(.) ã使ãããã«ãªãããã§ããHaskell の Trace の使い方ã«ã¯ã以ä¸ã®ããã«æ¸ããã¦ãã¾ãã
Haskellããã°ã©ãã³ã°ã«ãªãã¦ããã¨ï¼å¦çã®é£çµã«ã¯é¢æ°é©ç¨ãªãã¬ã¼ã¿ã¼ ($) ã§ã¯ãªãé¢æ°åæãªãã¬ã¼ã¿ã¼ (.) ã«ãªããã¨ãæ®éã«ãªãï¼
ãããã(.) ã§åæã§ããã®ã¯ãä¸ã¤ã®å¼æ°ãåãé¢æ°ã§ããç©ãããã®æªãåã¯ããããªå¶ç´ã®å³ãããªãã¬ã¼ã¿ãªãã¦ã使ããã¨ããã¯å°ãªãã¨æã£ã¦ãã¾ããããã¨ãã° dropWhile ã¯å¼æ°ãäºã¤åãã¾ãããã($) ã (.) ã«ã¯ç½®ãæãããã¾ããã
-- ããã¯ééã strip str = fst . break (==' ') . dropWhile (==' ') str
ããããHaskell ã§ã¯ãé¢æ°ãã«ãªã¼åã§ããã®ã§ããããªã®ã§ãããæ¸ãã¾ãã
strip str = (fst . break (==' ') . dropWhile (==' ')) str
åã³æ¬å¼§ãåºã¦ãã¦å«ã ãªã¨æã£ãç¬éã«ãããæ¸ãããã¨ã«æ°ä»ãã¯ãã§ãã
strip = fst . break (==' ') . dropWhile (==' ')
é«éé¢æ°
Google ã® MapReduce ãæåã«ãªã£ãããé«éé¢æ°ã®èª¬æã¯ãããä¸è¦ã§ããããåããªã人ã¯ãã君のプログラミング言語で、これ、できる?ããèªãã§ä¸ããã
大åãªã®ã¯ãããã¼ã¿ã®èµ°æ»ãã¨ãä»äºããåãããã¨ã§ãã
æ°ãããã¼ã¿åãå®ç¾©ããã¨ãã«ãã®åãå¦çããé«éé¢æ°ãæ¸ãã¹ãã§ãããããããã°ããã®ãã¼ã¿åã®åãæ±ããç°¡åã«ãªãããã®è¡¨ç¾ã®è©³ç´°ã«é¢ããç¥èãå±æåã§ããã
é 延è©ä¾¡
g (f input)
...
ãããgãfã®åºåããã¹ã¦èªããã¨ãªãçµäºããã°ãfã¯ç ´æ£ããããfã¯ç¡éã«åºåãçæãã¤ã¥ããåæ¢ããªãããã°ã©ã ã§ãæ§ããªããããã¯gãçµäºããã°ããã«å¼·å¶çã«fã¯åæ¢ãããããããã§ãããããã«ãããåæ¢æ¡ä»¶ã¯ã«ã¼ãã®æ¬ä½ã¨ã¯åé¢ããã¨ãã§ããå¼·åãªã¢ã¸ã¥ã¼ã«åãå¯è½ã¨ãªã
ãã¨ãã°ãn çªç®ã®ç´ æ°ãè¨ç®ããé¢æ° nthPrime ã¯ã以ä¸ã®ããã«æ¸ãã¾ãã
sieve (p:ps) = p : sieve nonMultipleP where nonMultipleP = filter (\q -> q `mod` p /= 0) ps primes = sieve [2..] nthPrime n = primes !! n - 1
"[2..]" ã sieve ãç¡éãªã¹ããçæãã¦ãããåæ¢æ¡ä»¶ãªãã¦æ°ã«ãã¦ããªããã¨ãåãã§ãããã
ããªãé¢æ°ããã°ã©ãã³ã°ã¯éè¦ããã«ã¯ãã¥ã¼ãã³æ³ã§å¹³æ¹æ ¹ãæ±ããã³ã¼ããè¼ã£ã¦ãã¾ããMiranda ã§æ¸ããã¦ããã®ã§ãåèã¾ã§ã« Haskell ã§æ¸ãç´ãã¦ã¿ã¾ããã
next :: Int -> Float -> Float next n x = (x + m / x) / 2 where m = fromInteger $ toInteger n within eps (a:b:rest) | abs(a-b) <= eps = b | otherwise = within eps (b:rest) sqroot a0 eps n = within eps $ iterate (next n) a0
iterate ã§ç¡éã®ãªã¹ããçæããã¦ããã®ãåãã¾ããï¼
ã¢ããã® bind
ã¢ããã¨ã¯ãMonad ã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ã§ãããã¼ã¿åã§ããMonad ã¯ã©ã¹ãæºããããã«ã¯ãbind(>>=)㨠return ã¨ããé¢æ°ãå®ç¾©ããå¿ è¦ãããã¾ããbind ã¯ããã®åã®éãç³ã§ããããªãã¡ãMonad ã§ããã°å ±éã®æ çµã¿ã¨ãã¦ããã®å¼·åãªç³ã使ãã訳ã§ãã
Haskell ã®ç´ æµãªå¿ç¨ä¾ã¯ããªãã¨ãã£ã¦ã Parsec ã§ããããParsec ã¯ãã¢ããã»ãã¼ãµã¼ã§ããå°ããªãã¼ãµã¼ãè¤æ°æ¸ãã¦ãbind ã§åæã§ãã¾ãã
ãã¨ãã°ãããã«ã¯ãªã¼ãã§å²ã¾ããæååã«ããããããã¼ãµã¼ã¯ã以ä¸ã®ããã«ãªãã¾ãã
quoted = do char '"' s <- many (noneOf "\"") char '"' return $ "\"" ++ s ++ "\""
ä¸æåã«ããããããã¼ãµã¼ char ã oneOf ãåæããã¦ããã大ããªãã¼ãµã¼ quoted ãæ§æããã¦ããã®ãåãã§ããããï¼