Hatena::Grouphaskell

[ pred x | x <- "Ibtlfmm!ojllj" ] RSSフィード

2009-05-16

[]ジェネレータ 16:04

PythonRubyのジェネレータのような仕組みを提供するモナドを書いた。

YieldモナドがあればPauseモナドはいらない。

import PauseMonad

main :: IO ()
main = tracePauseT $ do
  liftIO $ print 1
  pause
  liftIO $ print 2
  pause
  liftIO $ print 3
  pause
  liftIO $ print 4
import YieldMonad

main :: IO ()
main = traceYieldT $ do
  liftIO $ print 1
  yield "hoge"
  liftIO $ print 2
  yield "fuga"
  liftIO $ print 3
  yield "foo"
  liftIO $ print 4
トラックバック - http://haskell.g.hatena.ne.jp/illillli/20090516

2008-03-05

[]MonadBaseとMonadIO 01:01

HaskellWikiを見ているとMonadBaseというものを見つけた。

class (Monad m,Monad b) => MonadBase b m where
  liftBase :: b a -> m a

説明を読むとMonadIOの一般化らしい。

class (Monad m) => MonadIO m where
    liftIO :: IO a -> m a

MonadIOの方が「このモナドはIOができます」というなら、こちらは「このモナドの操作はあのモナドの中でもできます」という感じだろうか。日ごろ使う分にはliftIO = lift . liftIOで済ますのが大半なので、一般化されているのはいいことだと思う。

あれ?もしかしてMonadTransいらない?*1

*1:標準のHaskellではそもそも複数の型を取るクラスが宣言できないけど

トラックバック - http://haskell.g.hatena.ne.jp/illillli/20080305