1

有人可以解释一下以下同义词的含义以及如何阅读它:

type TCM a = ErrorT String (StateT MyEnv IO) a

到目前为止我能够理解的内容:

  • 我们说我们为某种类型引入了新名称,现在我们说我们称之为 TCM,它有一些参数 a

  • 我们有值构造函数 ErrorT(是什么产生了 ErrorT?),它接受三个参数:String、(StateT MyEnv IO) 和

  • (StateT MyEnv IO) - 我们在这里说我们有值构造函数 StateT 和 args MyEnv 和 IO。但是这种类型是做什么的?

我对吗?谁能解释一下它是如何工作的?感谢您的任何回复。

编辑:也许有人可以帮助我。我的程序中有以下函数来评估整数:

ms_exp :: Exp -> TCM ()    
ms_exp (EInt integer) = do
    return integer

它有这样的错误:

Couldn't match expected type `()' with actual type `Integer'

有什么提示吗?

4

1 回答 1

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

    type TCMInt = ErrorT String (StateT MyEnv IO) Int
    

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

  2. 不,ErrorT不是构造函数,它是类型构造函数。是什么构成元素ErrorT?嗯,这取决于是什么ErrorT。我想它是Control.Monad.Error,据说是由runErrorT函数构造的。

  3. 同样,StateT它不是一个构造函数,它是一个类型构造函数(使用符合thisnewtype的关键字创建)。从 中可以看出,类型构造函数需要两个类型名称来构造一个类型,因此您的代码通过和,产生类型。newtype State s aStateMyEnvIOStateT MyEnv IO

更新:您的函数希望通过do while you do将元素注入()到monad 中。您需要或将类型更改为。TCMreturn ()return integerreturn ()ms_expExp -> TCM Integer

于 2013-05-04T15:17:55.860 回答