ReaderT Monad Transformer 中 * 的用途是什么?
What is the purpose of * in the ReaderT Monad Transformer?
我正在查看 the documentation for the Reader monad and ReaderT monad 转换器。
相关定义为:
newtype ReaderT k r m a :: forall k. * -> (k -> *) -> k -> *
type Reader r = ReaderT * r Identity
我不明白 *
在定义中做了什么。特别是,我试图从 ReaderT 派生一个新的 monad,其中 IO 作为基本 monad 并且对 r
值有 class 约束。
我不确定为什么 ReaderT (k
) 有第四个输入,以及 Reader 在将 * 放在该位置时对该值做了什么。
*
是一种有值的类型:它代表 Int
、List Int
等。
forall k
表示k
不一定是那种。它代表任何类型,被视为您可以声明和操作的简单静态事物,但不一定与运行时值相关联。这方面的一个例子是当你想要 'decorate' 一些带有额外信息的其他类型时:刺绣类型没有理由附加任何类型的值,它是 "pure" 信息,对一些刺绣类型(通常有值)
这里更简单,您可以看到在 Reader
中,它全部专门化为 *
,而 m
专门化为 Identity
monad。这就是您希望 IO
monad 所在的位置。
至于约束,最好不要在类型本身中指定。使用时,如果您使用附加到类型类的特定方法,它将被动态添加。事实上,没有理由要求调用者提供不使用方法的表达式。
(除非您有充分的理由推导其他实例,如在 Dict
中您使用 GADT 捕获类型类见证作为运行时值,但这可能不是您想要做的)
我正在查看 the documentation for the Reader monad and ReaderT monad 转换器。
相关定义为:
newtype ReaderT k r m a :: forall k. * -> (k -> *) -> k -> *
type Reader r = ReaderT * r Identity
我不明白 *
在定义中做了什么。特别是,我试图从 ReaderT 派生一个新的 monad,其中 IO 作为基本 monad 并且对 r
值有 class 约束。
我不确定为什么 ReaderT (k
) 有第四个输入,以及 Reader 在将 * 放在该位置时对该值做了什么。
*
是一种有值的类型:它代表 Int
、List Int
等。
forall k
表示k
不一定是那种。它代表任何类型,被视为您可以声明和操作的简单静态事物,但不一定与运行时值相关联。这方面的一个例子是当你想要 'decorate' 一些带有额外信息的其他类型时:刺绣类型没有理由附加任何类型的值,它是 "pure" 信息,对一些刺绣类型(通常有值)
这里更简单,您可以看到在 Reader
中,它全部专门化为 *
,而 m
专门化为 Identity
monad。这就是您希望 IO
monad 所在的位置。
至于约束,最好不要在类型本身中指定。使用时,如果您使用附加到类型类的特定方法,它将被动态添加。事实上,没有理由要求调用者提供不使用方法的表达式。
(除非您有充分的理由推导其他实例,如在 Dict
中您使用 GADT 捕获类型类见证作为运行时值,但这可能不是您想要做的)