2014-11-26 2 views
3

Я хочу написать программу Haskell, которая вычисляет сумму чисел между двумя заданными числами. У меня есть следующий код:Haskell - слишком мало аргументов

sumInt :: Int -> Int -> Int 
sumInt x y 
    | x > y = 0 
    | otherwise = x + sumInt x+1 y 

Но когда я скомпилировать его я получаю следующее сообщение об ошибке:

SumInt is applied to too few arguments.

Я не понимаю, что я делаю неправильно. Есть идеи?

+0

Почему это было приостановлено? +1 даже для отрицания, этот вопрос определенно находится в рамках SO (и это тоже хорошо). – MasterMastic

ответ

5

Вы должны круглые скобки вокруг x+1:

| otherwise = x + sumInt (x + 1) y 

Причина заключается в том, что применение функции связывает более плотно, чем операторы, поэтому всякий раз, когда вы видите

f x <> y 

Это всегда обрабатывается как

(f x) <> y 

и никогда как

f (x <> y) 
+0

Как компилятор попытался прочитать его, когда он сообщил об ошибке? можете ли вы продемонстрировать с помощью круглых скобок? – MasterMastic

+2

@MasterMastic Компилятор прочитал бы это конкретное выражение как «x + (sumInt x) + (1 y)». Из-за полиморфизма числовых литералов, '1 y' на самом деле typechecks, у него просто нет экземпляра' Num', который является функцией. Ошибка возникла из 'sumInt x', который, как говорят, имеет тип' Int', причем 'x' известен как' Int', поэтому первая ошибка, с которой он сталкивается, является несоответствием между 'Int -> Int' и' Int' , для которого он предполагает, что у вас недостаточно параметров. – bheklilr

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