我正在使用ReaderT编写此类型的Monad实例,并通过派生实现。
newtype HIO a = HIO {runHIO :: Set HiPermission -> IO a}
我已经尝试过用这种方式实现
newtype HIO a = HIO {runHIO :: Set HiPermission -> IO a}
deriving (Functor, Applicative, Monad) via (ReaderT (Set HiPermission) IO)
但是出现了错误:
Couldn't match representation of type `Set HiPermission -> IO c' with that of `ReaderT (Set HiPermission) IO c'
arising from the coercion of the method
我做错了什么?
ReaderT
既是类型构造器,也是值构造器。为了让DerivingVia
生效,新类型构造器必须在作用域内,而不仅仅是类型本身。也就是说,你需要像import Control.Monad.Reader
或者import Control.Monad.Reader ( ReaderT(..) )
或者import Control.Monad.Reader ( ReaderT(ReaderT) )
这样引入。但是import Control.Monad.Reader ( ReaderT )
不管用,因为它只引入了类型而没有引入构造器。 - danidiaz:instances ReaderT (Set HiPermission) IO
列出可派生的实例,多参数类型目前不在列表中,因此它不会列出MonadReader (Set HiPermission)
,即使它可以被派生。 - Iceland_jackReaderT
值构造器会解决你的问题? - leftaroundabout