2011-12-30 9 views
23

foo :: Maybe Intと私はそれをバインドしたいとします。例えば、bar :: Int -> MaybeT (Writer String) Intとしたいのですが、どうすればよいでしょうか?MaybeTに何かの値を注入するには

私は自分liftMaybe関数を定義して、それを使う、などの可能性:

let liftMaybe = maybe (fail "Nothing") return in liftMaybe foo >>= bar 

しかし、それを行うには、より慣用的な(あるいは少なくとも簡潔な)方法はありますか?

答えて

20
MaybeT . return :: (Monad m) => Maybe a -> MaybeT m a 

標準名がないのは残念だと思います。より一般的な形態は、failの使用よりも好ましい、

です。私はちょうどどこか便利なモジュールに入れています。

Hayooはこの機能に対してwide variety of namesを示します。それらのうち、maybeZeroは私のお気に入りです。 liftMaybeは明らかなように、現れません。

+0

Thx、これは既に改善点です。しかし、私たちはもっと良くすることができますか? – user1078763

+0

「おそらくmzero return」より?疑わしい;それはすでに非常に短いです。私はあなたがそれを使うあらゆるところでこれをインライン展開することを勧めません。それを共通のモジュールに入れる方がずっと良い考えです。 – ehird

+0

これは 'fmapT ::(Monad m、Monad n、MonadTransformer t)=>(forall a。ma - > na) - >(forall a。tma - > tna)'のようなものの具体的な使用と見ることもできます。 「Maybe」は実際には「MaybeT Identity」と偽っている場合に限ります。私はその機能が完全な一般性では可能だとは思っていませんが、インスタンスとして特定のモナド・トランスを持つタイプ・クラスにすることができます。 –

関連する問題