newtype ReaderT r m a :: * -> (* -> *) -> * -> *
我无法理解如何理解上面的表达,尤其是
* -> (* -> *) -> * -> *
答案 0 :(得分:4)
它应该是
*
松散地说,上面的类型是一个函数的类型,它接受类型为* -> *
的参数,另一个类型为*
,另一个类型为*
,并产生结果类型为*
。
类型Int :: *
是所有类型的"类型"。例如。 Char :: *
,*
等
为避免混淆,'a'
并未真正调用"类型"但是"一种",以反映它在更高层次上运作。例如,Char
的类型为Char
,而*
的类型为* -> *
。
最后,种类Maybe
是一种一元类型的构造函数,例如[]
,IO
,(,) Char
,Either Bool
,{{1}所有这些都采用类型参数并返回一个类型。种类* -> *
也是任何仿函数,应用程序或monad。
因此,如果我们有类型r
,类型构造函数m
(通常是monad)和类型a
,我们有:
r :: *
m :: (* -> *)
a :: *
ReaderT :: * -> (* -> *) -> * -> *
ReaderT r :: (* -> *) -> * -> *
ReaderT r m :: * -> *
ReaderT r m a :: *
因此,当传递所有三个参数时,结果ReaderT r m a
是一个类型。