gpt4 book ai didi

haskell - ReaderT Monad Transformer 中 * 的用途是什么?

转载 作者:行者123 更新时间:2023-12-04 15:07:29 25 4
gpt4 key购买 nike

我在看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 上的类约束。值(value)。

我不确定为什么 ReaderT 有第四个输入( k )以及当 Reader 在该位置放置 * 时该值做什么。

最佳答案

*是具有值的类型:它代表 Int 之类的东西, List Int ETC..
forall k表示 k不一定是那种。它代表任何类型的类型,被视为简单的静态事物,您可以声明和操作它们,但不一定与运行时值相关联。一个例子是当你想用额外的信息“装饰”其他类型时:刺绣类型没有理由附加任何类型的值,它是“纯”信息,对于某些刺绣类型(通常有值)

在这里更简单,您可以在 Reader 中看到这一切都专门用于* , 和 m专门用于Identity单子(monad)。这就是你想要你的 IO 的地方。单子(monad)是。

至于约束,最好不要在类型本身中指定。在使用时,您使用附加到类型类的特定方法,它将被即时添加。事实上,编写不使用方法的表达式没有理由要求它们的调用者提供它。

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

关于haskell - ReaderT Monad Transformer 中 * 的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45686726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com