ニチアサクズ三銃士・真を連れてきたよ pic.twitter.com/zTfr6tyngE
— ばつ@2日目東C44 (@batuACT3) 2014, 7月 20
初見殺し三銃士を連れてきたよ pic.twitter.com/24cGXYDfG5
— Jun Inoue (@jun0inoue) 2014, 10月 10
ごめんなさい、タイトルはノリです。
Haskellでループ
アクションを使うループ。 ちなみにアクションは型的にはIO型。
main = do let loop i | i < 5 = do print i loop $ i + 1 loop _ = return () loop (-5)
IORefを使うループ。
import Data.IORef main = do i <- newIORef 0 let loop = do i' <- readIORef i if i' < 5 then do print i' writeIORef i $ i' + 1 loop else return () loop
通常はループの代わりに再帰を使いますが、それは参照透過性の海を汚さないため。
合計プログラム
1 + 2 + 3 + .... + nみたいなプログラムをアクションを使って書く。
import Data.IORef main = do s <- newIORef 0 let sum i | i <= 100 = do s' <- readIORef s writeIORef s $ s' + i sum $ i + 1 sum _ = readIORef s print =<< sum 0
アクションを使わない。
main = do let sum s i | i <= 100 = sum (s + i) (i + 1) sum s _ = s print $ sum 0 1
アプリカティブスタイルを使用したフィボナッチ
もうここまで来ると完全に初見殺しで知らないと分からない。
import Control.Applicative fib 0 = return 0 fib 1 = return 1 fib n | n > 1 = -- 演算子の関数化 (+) <$> fib (n - 2) <*> fib (n - 1) main = do print =<< fib 7