有人可以解释一下以下synonim的含义以及如何阅读它:
type TCM a = ErrorT String (StateT MyEnv IO) a
到目前为止我能够理解的是:
我们说我们为某种类型引入新名称,现在我们称之为TCM,它有一些参数a
我们有值构造函数ErrorT(是什么让ErrorT?)有三个参数:String,(StateT MyEnv IO)和
(StateT MyEnv IO) - 我们在这里说我们有值构造函数StateT和args MyEnv和IO。但这种类型是什么?
我是对的吗?谁能解释一下它是如何工作的?感谢您的回复。
编辑:也许有人可以帮助我。我的程序中有以下函数来评估Integer:
ms_exp :: Exp -> TCM ()
ms_exp (EInt integer) = do
return integer
它有这样的错误:
Couldn't match expected type `()' with actual type `Integer'
任何提示?
答案 0 :(得分:6)
嗯,ErrorT
类型已经有a
类型参数,如果我们愿意,我们可以专门化它,即make type
type TCMInt = ErrorT String (StateT MyEnv IO) Int
但是,我们可以将其保留为类型参数,就像您在示例中所做的那样。
不,ErrorT
不是值构造函数,它是类型构造函数。什么使ErrorT
成为一个元素?那么,这取决于ErrorT
是什么。我认为它是Control.Monad.Error,据说它是由runErrorT
函数构建的。
同样,StateT
不是值构造函数,它是类型构造函数(使用newtype
关键字创建{ {3}})。从newtype State s a
可以看出,State
类型构造函数需要两个类型名称来构造一个类型,因此代码会传递MyEnv
和IO
,从而产生StateT MyEnv IO
} type。
更新:您的函数希望在执行()
时TCM
向return ()
monad注入return integer
元素。您需要return ()
或将ms_exp
的类型更改为Exp -> TCM Integer
。