みどりねこ日記

よくわからないけど、頑張りますよ。

Haskellのモナド2(4)

Haskellのリスト内包表記と、リストモナドの形が似ているのは興味深いですね。例えば、下のコードは三平方の定理を満たすものをリストアップする関数です。

pythags = [(x, y, z) | z <- [1..], x <- [1..z], y <- [x..z], x^2 + y^2 == z^2]

これをリストモナドに書き直すと、以下のようになります。

import Control.Monad (guard)

pythags = do
	z <- [1..]
	x <- [1..z]
	y <- [x..z]
	guard (x^2 + y^2 == z^2)
	return (x, y, z)

guardについてはまだ説明していません。これはまたいずれ。