rubyのyieldの再現。 クロージャを毎度作る感じでできないか試していたらコンパイルが通りました。 import Yield main = print $ collect $ do yield 1 yield 2 yield 3 collect :: Yield () y a -> [y] collect m = fst $ foldYield cons [] m where cons ys y = (y:ys, ()) data Yield x y a = Yield y (x -> Yield x y a) | Stop a instance Monad (Yield x y) where return = Stop Yield y c >>= f = Yield y ((>>= f) . c) Stop a >>= f = f a yield :: y -> Yield x y