Haskell 类型未完全应用

Haskell 类型未完全应用,haskell,Haskell,我从haskell的书中得到了以下代码片段: embedded' :: MaybeT (ExceptT String (ReaderT () IO)) Int embedded' = MaybeT (ExceptT (ReaderT (const (return (Right (Just 1)))))) ExceptT的类型签名如下: newtype ExceptT e m a = ExceptT { runExceptT :: m (Either e a)) } 将嵌入的'函数的类型签

我从haskell的书中得到了以下代码片段:

embedded' :: MaybeT (ExceptT String (ReaderT () IO)) Int
embedded' = MaybeT (ExceptT (ReaderT (const (return (Right (Just 1))))))
ExceptT
的类型签名如下:

newtype ExceptT e m a =
  ExceptT { runExceptT :: m (Either e a)) }
嵌入的'
函数的类型签名与
ExceptT
类型构造函数进行比较:

        ExceptT   e             m                 a
                  |             |                 |
MaybeT (ExceptT String   (ReaderT () IO) (**missing here**)  ) Int
我怎么能把
作为更高级的人留下来

我也试过:

fullType :: ExceptT String []
fullType = undefined
编译器抱怨:

* Expecting one more argument to `ExceptT String []'
  Expected a type, but `ExceptT String []' has kind `* -> *'
* In the type signature:
    fullType :: ExceptT String []

失败,已加载模块:无。

免责声明:我不在Haskell环境中,因此这可能完全是胡说八道

ExceptT
上缺少的位置输入一个显式类型变量:

embedded' :: MaybeT (ExceptT String (ReaderT () IO) a) Int
embedded' = MaybeT (ExceptT (ReaderT (const (return (Right (Just 1))))))
希望编译器能够找出
a
应该是什么

您遇到的问题(在您的
fullType
示例中更明显地显示)是不可能为某个对象指定类型
*->*
。函数、值等都需要具有类型
*

对类型构造函数进行curry运算会得到一个
*->*
,因此必须为所有参数提供一些内容


embedded'
的签名中添加一个类型参数会使它有点像
*
,但在
a
上是多态的免责声明:我不在Haskell环境中,所以这可能是完全胡说八道

ExceptT
上缺少的位置输入一个显式类型变量:

embedded' :: MaybeT (ExceptT String (ReaderT () IO) a) Int
embedded' = MaybeT (ExceptT (ReaderT (const (return (Right (Just 1))))))
希望编译器能够找出
a
应该是什么

您遇到的问题(在您的
fullType
示例中更明显地显示)是不可能为某个对象指定类型
*->*
。函数、值等都需要具有类型
*

对类型构造函数进行curry运算会得到一个
*->*
,因此必须为所有参数提供一些内容


embedded'
的签名中添加一个类型参数会使其成为一种
*
,但在
a
上是多态的,您可能会被最外层的
MaybeT
搞糊涂。此类型分别由两种类型的参数进行参数化,这两种参数分别为
m::*->*
a::*
。因此,除了字符串(ReaderT()IO)
之外的
确实缺少
a
,因为它是
MaybeT
第一个参数,应该是
*->*
类型。如果我们将
Int
应用于
ExceptT
,它将变成
*
,然后它就不能传递给
MaybeT
,您可能会被最外层的
MaybeT
搞糊涂。此类型分别由两种类型的参数进行参数化,这两种参数分别为
m::*->*
a::*
。因此,除了字符串(ReaderT()IO)
之外的
确实缺少
a
,因为它是
MaybeT
第一个参数,应该是
*->*
类型。如果我们将
Int
应用于
ExceptT
,它将变成
*
,然后它就不能传递给
MaybeT

,我不太明白缺少什么。在你的例子中,
a
Int
MaybeT
获得一种
*->*
,和一个
a
Int
,并将
a
应用于
*->*
。我不太明白缺少什么。在你的例子中,
a
Int
MaybeT
获取一种类型
*->*
,以及一个
a
Int
,并将
a
应用于
*->*