モナド
11.5 モナドの構文
let節について
あいやぁ、もうすでに忘れていました、let節。。。
急いで前に戻って復習しました。
なるほど、C言語などのローカル変数宣言のようなものですね。
これをdo式の中で使おうとするとコンパイルエラーになってしまいます。
そのため、do式内でletを使うための特別な構文(inを省略出来る)があるとのこと。
…let節の復習になりました。
こんな感じ。
main = do let a = [1, 2, 3, 4] print $ mySum a mySum :: [Int] -> Int mySum [] = 0 mySum (a:as) = a + mySum as
if式について
if式もlet節と同じでdo式の中でそのまま使うと怒られます。
if式ではdoとインデントを変えることで対応します。
こんな感じ。
main = do print $ myFunc 100 print $ myFunc (-1) myFunc :: Int -> Int myFunc x = do if x > 0 then x else 0
確かにthen、elseをifと同じインデントにしたら怒られました。
なお、本書中にwhen、unlessを使いましょうとあるのでちょっと使ってみました。
- doif_example.hs
import Monad main = do print $ myFunc 100 print $ myFunc (-1) myFunc1 100 myFunc2 (-1) myFunc :: Int -> Int myFunc x = do if x > 0 then x else 0 myFunc1 :: Int -> IO () myFunc1 x = when (x > 0) (putStrLn "x > 0") myFunc2 :: Int -> IO () myFunc2 x = unless (x > 0) (putStrLn "x <= 0")
実行結果はこんな感じ。
% ghc -W -o doif_example doif_example.hs % ./doif_example 100 0 x > 0 x <= 0
いい感じです♪