我有这个记录:
import Data.Functor.Identity
import Control.Monad.Trans.Identity
import Data.Coerce
data Env m = Env {
logger :: String -> m ()
}
env :: Env IO
env = undefined
和这个强制函数
decorate
:: Coercible (r_ m) (r_ (IdentityT m))
=> r_ m -> r_ (IdentityT m)
decorate = coerce
这适用于没有问题的记录值:
decoratedEnv :: Env (IdentityT IO)
decoratedEnv = decorate env
但是,如果我定义唯一稍微复杂的记录
data Env' h m = Env' {
logger' :: h (String -> m ())
}
env' :: Env' Identity IO
env' = undefined
并尝试IdentityT
像以前一样插入包装器
decoratedEnv' :: Env' Identity (IdentityT IO)
decoratedEnv' = decorate env'
我得到错误:
* Couldn't match type `IO' with `IdentityT IO'
arising from a use of `decorate'
在我看来,额外的Identity
参数Env'
不应该停止coerce
工作。为什么coerce
在这种情况下会失败?有没有办法让coerce
工作?