Ошибка типа в функции Haskell

Я написал функцию Haskell следующим образом:

shift :: Subst a -> Subst a
shift (S s) = [(x, (subst s' d)) | (x,d) <- s] where 
      s' = [(x,d) | (x,d) <- s, null (vars d)]

С таким типом данных data Subst a = S [(String,a)]

Я объявил subst как subst :: Subst a -> a -> a, а vars как vars :: a -> [String]. Когда я запускаю это, я получаю ошибку типа. Есть идеи, почему?


person Bobo    schedule 10.11.2012    source источник
comment
Когда вы задаете такой вопрос, дайте нам сообщение об ошибке. Сообщения об ошибках пытаются помочь программисту понять, что не так. Даже если они ничего для тебя не значат, они ТАК помогут тебе. А затем, получив ответ, посмотрите на сообщение об ошибке и попытайтесь понять, как оно соответствует объяснению вашей проблемы. Это постепенно даст вам возможность использовать тип сообщений об ошибках, чтобы определить проблему для себя!   -  person Ben    schedule 10.11.2012


Ответы (1)


Ваша функция shift заявлена ​​как возвращающая Subst, но на самом деле она возвращает список. Вероятно, вы хотели обернуть конструктор Subst вокруг списка.

Затем ваша функция subst объявляется принимающей аргумент Subst, но вы вызываете ее со списком - в основном та же проблема.

Кроме того, ваша функция vars, вероятно, также содержит ошибку типа, потому что, как я указал в своем ответе на ваш предыдущий вопрос, вы не можете определить осмысленную функцию типа a -> [String].

person sepp2k    schedule 10.11.2012
comment
да, ты был прав, это то, чего мне не хватало. Исправлено сейчас. Спасибо! - person Bobo; 10.11.2012