Joh*_*ler 6 haskell monad-transformers
相关定义是:
newtype ReaderT k r m a :: forall k. * -> (k -> *) -> k -> *
type Reader r = ReaderT * r Identity
Run Code Online (Sandbox Code Playgroud)
我不明白*在定义中做了什么.特别是我试图从ReaderT派生一个新的monad,其中IO作为基本monad,并且对r值有一个类约束.
我不确定为什么ReaderT(k)有第四个输入,以及当它将*放在该位置时Reader正在使用该值.
*就是那种类型的值:它代表之类的东西Int,List Int等等.
forall k手段k不一定是那种.它代表任何类型的类型,被视为可以声明和操作的简单静态事物,但不一定与运行时值相关联.这方面的一个例子是,当你想"装饰"一些其他类型的额外信息:绣花类型没有理由,任何形式的连接到它的值,它是"纯"的信息,一些绣花型(通常具有值)
更简单的是,你可以看到,Reader所有这些都是专门的*,并m专门为Identitymonad.这就是你想要你的IOmonad 的地方.
至于约束,最好不要在类型本身中指定它.在使用时,您使用附加到类型类的特定方法,它将被动态添加.实际上,没有理由写出不使用方法的表达式应该通过要求其呼叫者提供它来承担责任.
(除非你有充分的理由去推断其他实例,比如Dict你用类似GADT捕获类型类证人作为运行时值,但这可能不是你想要做的)
| 归档时间: |
|
| 查看次数: |
178 次 |
| 最近记录: |