data Freer f a where Pure :: a -> Freer f a Impure :: f x -> (x -> Freer f a) -> Freer f a instance Monad (Freer f a) where return = Pure Pure x >>= k = k x Impure fx k' >>= k = Impure fx (k' >>> k) Pure に関しては Free と同じだが、 Impure の方は f x の値とそれを使う計算(継続)を合わせて持ち回り、 >>= で値を計算するのではなく継続を組み立てるようにしている。 >>> は Category クラスにおける射の合成で、ここでは Kleisli 射を合成して k' をした後に k をする計算を作っている。 先述の通り、この定義は Operational モナドと同一だが、