2013-05-04 6 views
1

Может кто-нибудь объяснить мне, что следующий синоним средство и как читать:определение синонима Haskell

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

То, что я был в состоянии понять до сих пор:

  • мы говорим, что мы вводим новое имя для некоторого типа, и теперь мы говорим, что мы называем его TCM и имеет некоторый параметр a

  • У нас есть конструктор значений ErrorT (что делает ErrorT?), который принимает три аргумента: String, (StateT MyEnv IO) и a

  • (StateT MyEnv IO) - здесь мы говорим, что у нас есть конструктор состояний StateT и args MyEnv и IO. Но что делает этот тип?

Я прав? Может ли кто-нибудь объяснить мне, как это работает? Спасибо за любые ответы.

Редактировать: Возможно, кто-то может помочь мне и этим. Я STH следующую функцию в моей программе, оценить Integer:

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

и имеют такую ​​ошибку:

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

Любые намеки?

+4

ErrorT и StateT не являются конструкторами значений, а конструкторами типа.Правая часть определения типа - это всего лишь тип. – Ingo

ответ

6
  1. Ну, ErrorT тип уже имел параметр a типа, если мы хотим, мы могли бы специализироваться его, то есть, сделать тип

    type TCMInt = ErrorT String (StateT MyEnv IO) Int 
    

    Однако, мы можем оставить его в качестве параметра типа , как это было в вашем примере.

  2. Нет, ErrorT не значение конструктора, это типа конструктор. Что делает элемент ErrorT? Ну, это зависит от того, что такое ErrorT. Я полагаю, что это Control.Monad.Error, и сказано, что он построен функцией runErrorT.

  3. Опять же, StateT не значение конструктора, это типа конструктор (созданный с помощью ключевого слова newtype Acoording в this). Как видно из newtype State s a, конструкторы типа State ожидают, что два типа имен построят тип, поэтому ваш код проходит MyEnv и IO, что дает тип StateT MyEnv IO.

Для обновления: ваша функция рассчитывает внедрить элемент () в TCM монады, делая return() в то время как вы делаете return integer. Вам необходимо либо return(), либо изменить тип ms_exp на Exp -> TCM Integer.

+0

+1 Хорошо, большое вам спасибо за ваш ответ! Это мне очень помогло! – JosephConrad

Смежные вопросы