Ваша линия:
help x y = if y==0 then x else help(x+y,y-1)
не является правильным синтаксисом для вызова функции. Потому что здесь компилятор Haskell интерпретирует это как:
help x y = if y==0 then x else help (x+y,y-1)
-- ^ a tuple
Вместо этого вы должны написать:
help x y = if y==0 then x else help (x+y) (y-1)
-- ^ two arguments
Кроме того, вы также можете использовать охранников, например:
helper x y | y == 0 = x
| otherwise = help (x+y) (y-1)
Наконец, есть ошибка и в первой строке sum2
. Должно быть x
вместо y
:
sum2 x = help 0 x
Итак, в полном объеме получаем:
sum2 x = help 0 x
helper s x | x == 0 = s
| otherwise = help (s+x) (x-1)
Я также переименовал y
в helper
в x
и x
в s
(как в s
um), чтобы сделать его менее запутанным (престижность @Bergi за комментарии по этому поводу).
Или используйте эта-сокращение:
sum2 = help 0
Наконец, обратите внимание, что для этого вам не нужна рекурсия. Реализация, которая будет работать быстрее, выглядит следующим образом:
sum3 x = div (x*(x+1)) 2
С:
n
---
\ (n+1) n
/ i = -------
--- 2
i=1
person
Willem Van Onsem
schedule
02.05.2017
0+500000+499999+499998...
, которые выполняются только после того, как мы закончим повторяться. Исправление будет состоять в том, чтобы использовать шаблоны seq/bang или использовать какой-либо другой источник строгости, напримерfoldl' (+) 0
. - person Taren   schedule 03.05.2017