我正在查看有关Reader Monad和ReaderT的文档。
相关定义如下:
newtype ReaderT k r m a :: forall k. * -> (k -> *) -> k -> *
type Reader r = ReaderT * r Identity
我不理解定义中的*
是什么意思。特别是我正在尝试从以IO为基础monad和对r
值有类约束的ReaderT派生出一个新的monad。
我不确定为什么ReaderT有第四个输入(k
),以及当它在那个位置放置一个*时,Reader会如何处理该值。
ReaderT
的源代码是newtype ReaderT r m a = ReaderT { runReaderT :: r -> m a }
。文档中生成的k
只是 Haddock 强调ReaderT
的多态性(在定义它的模块中启用了-XPolyKinds
)。 - AlecReaderT
的polykinded定义的阻碍。正如@Alec所说,k
参数是haddock的产物 - 实际上,它完全是隐含的,你可以假装ReaderT :: (* -> *) -> * -> *
(因为它确实具有该类型)。 - user2407038TypeInType
可能会使事情变得更加模糊)。 - David Young