関数型プログラミング言語Haskell Part5
■ このスレッドは過去ログ倉庫に格納されています
0421デフォルトの名無しさん
2006/06/24(土) 18:56:04do { v0 <- e0; v1 <- e1; ...; eN }
は
e0 >>= (\v0 -> e1 >>= (\v1 -> ... eN))
の略記。このことと、
x >>= f = concatMap f x
return x = [x]
guard b = if b then return () else mzero
mzero = []
を踏まえると、次のように変形できる。
do {x <- [1..10]; _ <- guard(x `mod` 2 /= 0); return x}
= [1..10] >>= \x -> guard(x `mod` 2 /= 0) >>= \_ -> return x
= [1..10] >>= \x -> (if x `mod` 2 /= 0 then [()] else []) >> \_ -> return x
= [1..10] >>= \x -> (if x `mod` 2 /= 0 then [()] else []) >> \_ -> [x]
= [1..10] >>= \x -> concatMap (\_ -> [x]) (if x `mod` 2 /= 0 then [()] else []
= [1..10] >>= \x -> if x `mod` 2 /= 0 then [x] else []
= concatMap (\x -> if x `mod` 2 /= 0 then [x] else []) [1..10]
見ての通り、mplusは無関係。
■ このスレッドは過去ログ倉庫に格納されています