Standard monad transformers
Haskell の標準ライブラリには、monad transformer をサポートするいくつかのクラスと、いくつかの標準モナドの transformer バージョンが収載されている。 The MonadTrans and MonadIO classes MonadTrans クラスは、Control.Monad.Trans.Class で定義されている。MonadTrans クラスの関数は lift ひとつだけだ。lift 関数は、複合モナドの内側のモナド値 conputation を外側の複合モナドのモナド値に変換する。 class MonadTrans t where lift :: (Monad m) => m a -> t m a IO モナドに特化された lift 関数をもつモナドは、MonadIO クラスのインスタンスだ。MonadIO クラスは Control.Monad.IO.Class に定義されている。MonadIO クラスのたったひとつの関数は liftIO だ。 class (Monad m) => MonadIO m where liftIO :: IO a -> m a Transformer versions of standard monads 標準モナドに対しては、それに相当する transformer バージョンの複合モナドがある。しかし、それらが同じような方法で複合モナドに変換されているわけではない。たとえば、ContT 複合モナドは Cont モナドのコンテナの値の (a->r)->r 型の関数を、(a->m r)->m r 型の関数に変更しているが、StateT 複合モナドはそれとは異なっている。StateT 複合モナドは、State モナドのモナド値のコンテナの s->(a,s) 型の関数の代わりに、s->m (a,s) 型の関数を採用している。標準型のモナドを trannsformer バージョンの複合モナドに変換する一般的な法則はない。標準モナドのコンテキストでの意味を考えながら、transformer バージョンの複合モナドは作られている。次の表は、標準モナドと transformer バージョンの複合モナドとの対照表だ。
複合モナドを作るときは、組み合わせるモナドの順番が大切だ。StateT s (Error e) と ErrorT e (State s) では意味が違っている。前者は複合型の s -> Error e (a,s) を作り出す。これは、新しい状態を戻値として返すか、または、エラーを発生させる。後者は、複合型の s -> (Error e a,s) を作り出す。これは、モナド値 calculation は常に新しい状態を返すが、その値はエラーか、または、普通の値だ。 注:このセクションは総論的な記述なので細かい点は理解しづらいところがある。実例を何個か経験してからもう一度読み返すと分かりやすいのだろう。 前へ 目次 次へ
by tnomura9
| 2013-08-02 23:02
| Haskell
|
Comments(0)
|
カテゴリ
新型コロナウイルス 主インデックス Haskell 記事リスト 圏論記事リスト 考えるということのリスト 考えるということ ラッセルのパラドックス Haskell Prelude Ocaml ボーカロイド 圏論 jQuery デモ HTML Python ツールボックス XAMPP Ruby ubuntu WordPress 脳の話 話のネタ リンク 幸福論 キリスト教 心の話 メモ 電子カルテ Dojo JavaScript C# NetWalker ed と sed HTML Raspberry Pi C 言語 命題論理 以前の記事
最新のトラックバック
最新のコメント
ファン
記事ランキング
ブログジャンル
画像一覧
|
ファン申請 |
||