【问题标题】:Reader Transformer Monad读者变压器单子
【发布时间】:2016-04-17 19:32:42
【问题描述】:
newtype ReaderT r m a :: * -> (* -> *) -> * -> *

我不明白如何理解上面的表达,尤其是 * -> (* -> *) -> * -> *

【问题讨论】:

  • 你的问题和例子不是很清楚
  • 它是一种签名 - * 代表一个类型 - 所以它告诉你 r 是一个类型,m 是一个类型构造函数(如 Maybe 或 @ 987654327@ - 你给它们一个类型,它们返回一个)并且a 是一个类型 - 结果(ReaderT r m a)又是一个类型 - 它只是为了帮助你理解所涉及的部分;)

标签: haskell


【解决方案1】:

其实应该是

ReaderT :: * -> (* -> *) -> * -> *

简单地说,上面的类型是一个函数的类型,它接受一个*类型的参数,另一个* -> *类型的参数,另一个*类型的参数,并产生一个*类型的结果。 * 类型是“所有类型的类型”。例如。 Int :: *Char :: *

为避免混淆,* 并不是真正的“一种类型”而是“一种”,以反映它在更高级别上工作。例如,'a' 的类型为 CharChar 的类型为 *

最后,* -> * 类型是一元类型构造函数,例如Maybe[]IO(,) CharEither Bool 等。所有这些都带有类型参数和返回一个类型。 * -> * 类型也是任何函子、应用程序或 monad 的类型。

所以,如果我们有类型r、一个类型构造函数m(通常是一个monad)和一个类型a,我们就有:

r :: *
m :: (* -> *)
a :: *
ReaderT :: * -> (* -> *) -> * -> *
ReaderT r :: (* -> *) -> * -> *
ReaderT r m :: * -> *
ReaderT r m a :: *

因此,当所有三个参数都被传递时,结果ReaderT r m a 是一个类型。

【讨论】:

  • 为什么(* -> *) 是单子?
  • @Gilgamesz * -> * 不是 monad,但如果你有任何 monad m,那么 m 必须有 kind * -> *。例如。 m = Maybe,或m = IO
  • (,)* -> * -> * 不是吗?我以为你不能把* -> * 想象成*
  • @jd823592 是的,但是(,) Char* -> *(不幸的是,自动插入换行符...)
  • @chi 哦,对不起,我没有注意到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 2015-09-28
相关资源
最近更新 更多