在ReaderT Monad Transformer中*的目的是什么?

时间:2017-08-15 04:58:14

标签: haskell monad-transformers

我正在the documentation查看Reader monadReaderT monad变压器。

相关定义是:

newtype ReaderT k r m a :: forall k. * -> (k -> *) -> k -> *
type Reader r = ReaderT * r Identity

我不明白*在定义中做了什么。特别是我试图从ReaderT派生一个新的monad,其中IO作为基础monad,并且r值的类约束。

我不确定为什么ReaderT(k)有第四个输入,以及当它将*置于该位置时Reader正在使用该值。

1 个答案:

答案 0 :(得分:5)

*是具有值的类型:它代表IntList Int等内容。

forall k表示k不一定是那种。它代表任何类型的类型,被视为可以声明和操作的简单静态事物,但不一定与运行时值相关联。这方面的一个例子就是你想要装饰'一些其他类型的额外信息:刺绣类型没有理由附加任何类型的价值,它是"纯粹"信息,到一些绣花类型(通常有价值)

更简单地说,您可以在Reader中看到它全部专注于*,而m专门用于Identity monad。那就是你想要IO monad的地方。

对于约束,最好不要在类型本身中指定它。在使用时,您使用附加到类型类的特定方法,它将被动态添加。事实上,没有理由写出不使用某种方法的表达方式应该要求其呼叫者提供它。

(除非你有充分的理由去推断其他实例,例如在Dict中你用类似GADT捕获类型类证人作为运行时值,但这可能不是你想要的做)