读者变压器Monad

时间:2016-04-17 19:32:43

标签: haskell

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

我无法理解如何理解上面的表达,尤其是 * -> (* -> *) -> * -> *

1 个答案:

答案 0 :(得分:4)

它应该是

*

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

为避免混淆,'a'并未真正调用"类型"但是"一种",以反映它在更高层次上运作。例如,Char的类型为Char,而*的类型为* -> *

最后,种类Maybe是一种一元类型的构造函数,例如[]IO(,) CharEither Bool,{{1}所有这些都采用类型参数并返回一个类型。种类* -> *也是任何仿函数,应用程序或monad。

因此,如果我们有类型r,类型构造函数m(通常是monad)和类型a,我们有:

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

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