モナド

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


いい感じです♪