2017-08-20 9 views
2

(ExceptT Error IO Foo)(ExceptT Error (StateT Bar IO) Baz)に「セミリフト」しようとしています。トランススタックの中央にモナドを追加する

私は試しましたliftfmap lift、およびfmap return、そして何もありません。ここに標準的なイディオムはありますか?

> import Control.Monad.Except 
> import Control.Monad.State 
> data Error 
> data Foo 
> data Bar 
> data Baz 
> x = undefined :: ExceptT Error IO Foo 
> y = undefined :: (ExceptT Error (StateT Bar IO) Baz) -> a 

> f = ??? -- This is what I'm trying to find. 

> :t y (f x) 
y (f x) :: a 
+1

私は、HTTPS([ 'mapExceptT']あなたが探していると思います。 haskell.org/package/transformers-0.5.4.0/docs/Control-Monad-Trans-Except.html#v:mapExceptT)ですが、具体的な例を追うのは難しいです。 – Alec

+0

[モナド・トランス・スタックの内部を固定するための持ち上げ](https://stackoverflow.com/a/27206159/791604)のポイント(2)も参照してください。多分この質問はその質問と重複しています。 –

答えて

5

ExceptT newtypesを無視して、あなたは

IO (Either Error Foo) 

を持っていて、私はあなたがBazで欲しいものが表示されない(

StateT Bar IO (Either Error Foo) 

をしたいので、私はそれを無視しています。 )

これはちょうどliftです。だから私はあなたがAlec notedとして

ExceptT . lift . runExceptT 

を使用することができるはずと信じて、これはmapExceptTを使って書くことができます:// hackage:

mapExceptT lift 
+0

ああ、ありがとう!私はそれが何か単純であることを知っていた... –

関連する問題