2015-12-26 5 views
0

Это мой код до сих пор:Что я делаю неправильно в реализации этой рекурсивной функции?

test n p 
    |p > n = 0 
    |p == n = 1 
    |otherwise = sum [test n-p q|q<-[1..p+1]] 

Это должно реализовать простую рекурсивную функцию (принимающие неотрицательные целые числа)

enter image description here

Однако я получаю сообщение об ошибке, что я не понимаю. (Я не смог скопировать его с консоли ghci, поэтому я просто набрал ее) Может ли кто-нибудь сказать мне, что здесь не так?

Expected a constraint, but 'Int' has kind '*' 
In the type signature for 'test': test :: Int -> Int => Int 
+0

Почему downvote ?? – flawr

+1

Ваша подпись типа неправильная, но вы не включили ее в вопрос. Тип 'test' должен быть' Int -> Int -> Int' –

+4

Кроме того, вам нужны скобки вокруг 'n-p' –

ответ

3
sum [test n-p q|q<-[1..p+1]] 

Применение функции имеет очень высокий приоритет в Haskell. Выше анализируется как:

sum [ (test n) - (p q) |q<-[1..p+1]] 

Над test используется в качестве одноместной функции, возвращающей число, и p также используется в качестве одноместной функции, возвращающей число. Это вызывает ошибку типа.

Кроме того, обратите внимание, что => неправильно в сигнатуре типа:

test :: Int -> Int => Int 
--    ^^^^ 

выше вызывает GHC попробовать разбор левой части Int -> Int, как если бы это было ограничение класса, но это тип (» имеет вид * ", в технических терминах), поэтому сообщается об ошибке.

1
test n p 
    |p > n = 0 
    |p == n = 1 
    |otherwise = sum [test (n-p) q|q<-[1..p+1]] 

Т.е. круглые скобки вокруг (n-p)

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