Haskell同义词定义

时间:2013-05-04 14:59:50

标签: haskell

有人可以解释一下以下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'

任何提示?

1 个答案:

答案 0 :(得分:6)

  1. 嗯,ErrorT类型已经有a类型参数,如果我们愿意,我们可以专门化它,即make type

    type TCMInt = ErrorT String (StateT MyEnv IO) Int
    

    但是,我们可以将其保留为类型参数,就像您在示例中所做的那样。

  2. 不,ErrorT不是构造函数,它是类型构造函数。什么使ErrorT成为一个元素?那么,这取决于ErrorT是什么。我认为它是Control.Monad.Error,据说它是由runErrorT函数构建的。

  3. 同样,StateT不是构造函数,它是类型构造函数(使用newtype关键字创建{ {3}})。从newtype State s a可以看出,State类型构造函数需要两个类型名称来构造一个类型,因此代码会传递MyEnvIO,从而产生StateT MyEnv IO } type。

  4. 更新:您的函数希望在执行()TCMreturn () monad注入return integer元素。您需要return ()或将ms_exp的类型更改为Exp -> TCM Integer