Синтаксис неверен.В Haskell пробел имеет значение, как и в Python.Более конкретно, если у вас есть текст, который начинается в первом столбце строки, интерпретатор будет думать, что это объявление верхнего уровня.Правильный синтаксис был бы (например):
fact :: Int -> Int
fact n = if n == 0
then 1
else n * fact (n-1)
Вы также можете поместить if в одну строку, если хотите.Поэтому, если вы используете интерактивное приглашение, вы можете сделать:
λ> let fact n = if n == 0 then 1 else n * fact (n-1)
Обратите внимание, что вам нужно будет использовать let
для определения функций в приглашении (по крайней мере, так это делается вGHCi, я не уверен насчет объятий).Вам будет лучше поместить их в отдельный файл и затем загрузить его в интерпретатор.Но в любом случае, в любом случае, гораздо более приятное решение будет использовать сопоставление с образцом:
fact :: Int -> Int
fact 0 = 1
fact n = n * fact (n-1)
Здесь интерпретатор сопоставит образец с первым аргументом функции с перечисленными возможными случаями.Поэтому, если первый аргумент равен нулю, результат равен 1, в противном случае функция применяется рекурсивно.