14.3 計算の状態の正体
これは、僕のなかで非常に納得のいくものだった。
Haskell以外のほとんどの言語における「代入」という操作は、状態付きの計算と捉えることができます。
MooseやPythonでlispとかschemeを書いたことがあったが、そのときに環境というスタックを用意したなぁと妙に納得した。
この本は、日本の初級Haskellerのレベルを押し上げる役割を担うんじゃないかなぁと。少なくとも僕は本書を読んだことで、haskell細胞が進化した(by トリコ)
それからWriterモナドが面白いなぁと改めて思ったので写経。
import Control.Monad.Writer gcd' :: Int -> Int -> Writer [String] Int gcd' a b | b == 0 = do tell ["Finished with " ++ show a] return a | otherwise = do tell [show a ++ " mod " ++ show b ++ " = " ++ show (a `mod` b)] gcd' b (a `mod` b)
実行すると、ログがついて回るのでsndで抜き出す。
*Main> mapM_ putStrLn $ snd $ runWriter (gcd' 4351 3776) 4351 mod 3776 = 575 3776 mod 575 = 326 575 mod 326 = 249 326 mod 249 = 77 249 mod 77 = 18 77 mod 18 = 5 18 mod 5 = 3 5 mod 3 = 2 3 mod 2 = 1 2 mod 1 = 0 Finished with 1
Haskellはやっぱり面白いなぁ。もう少し書けるようになりたい。