2012-01-09 3 views
1

Итак, следуя вместе с примерами кода на streams, это не может быть загружен в GHCI:Неверный тип подписи в рекурсивном конструктора данных

data MyStream a = MyStream a (MyStream a) 

intsFrom n :: MyStream Integer 
intsFrom n = MyStream n $ intsFrom $ n + 1 

Получение ошибки:

stream.hs:3:1: 
    Invalid type signature: intsFrom n :: MyStream Integer 
    Should be of form <variable> :: <type> 
Failed, modules loaded: none. 

Любые идеи? Благодаря!

Update: Если я просто наберите intsFrom :: MyStream Integer я получаю сообщение об ошибке:

stream.hs:4:1: 
    The equation(s) for `intsFrom' have one argument, 
    but its type `MyStream Integer' has none 
Failed, modules loaded: none. 
+2

А, прошу прощения за сломанную подпись. Я обновил статью. – shang

ответ

6

Похоже, что вы хотите, чтобы ваша подпись быть что-то вроде этого:

intsFrom :: Integer -> MyStream Integer 

Integer вот ваш аргумент, и MyStream Integer является результат intsFrom.

4

Вы должны просто использовать имя функции в соответствии с типом подписи, а не добавлять имена параметров. Таким образом, вместо

intsFrom n :: MyStream Integer 

использования

intsFrom :: MyStream Integer 

Вы также должны убедиться, что тип вы объявляете соответствует функции. Поскольку функция принимает Integer параметр, правильная подпись будет:

intsFrom :: Integer -> MyStream Integer 
Смежные вопросы