Я думаю, что нотация fib (n+2) = ...
не работает и является синтаксической ошибкой. Вы можете использовать «регулярное выражение» соответствие стиля для paramters, как списки или кортежи:
foo (x:xs) = ...
где х глава списка и хз оставшейся части списка или
foo (x:[]) =
который сопоставляется если список имеет только один элемент слева и который хранится в x. Даже сложные совпадения, такие как
foo ((n,(x:xs)):rg) = ...
возможны. Определения функций в haskell - сложная тема, и существует много разных стилей, которые можно использовать.
Другой возможностью является использование схемы «переключатель-случай»:
foo f x | (f x) = [x]
foo _ _ = []
В этом случае элемент «х» заворачивают в списке, если условие (f x)
верно. В других случаях параметры f и x не интересны и возвращается пустой список.
Чтобы устранить проблему, я не думаю, что любой из них применим, но почему бы не бросить в определении функции Catch-остальной-параметр-значение, как:
fib n = (fib (n - 1)) + (fib (n - 2))
Надеется, что это помогает ,
Оливер
Возможно, это представляет интерес? http://stackoverflow.com/questions/3748592/what-are-nk-patterns-and-why-are-they-banned-from-haskell-2010 – gspr
Эти так называемые (n + k) шаблоны были запрещены из Haskell некоторое время назад. Замените третью строку следующим образом: 'fib n = fib (n - 1) + fib (n - 2)'. – Vitus
NB Существует другой способ увидеть вызовы функций в левой части уравнения: [ViewPatterns] (http://hackage.haskell.org/trac/ghc/wiki/ViewPatterns). Я довольно удивлен, что они не более распространены. –