Я начал работать через http://www.cs.nott.ac.uk/~pszgmh/monads для введения в курс функционального программирования. Что может быть лучше, чтобы попытаться понять что-то, чем на самом деле попробовать и протестировать код.
Увы, на второй странице встречаю следующее:
data Expr = Val Int | Div Expr Expr
eval :: Expr -> Int
eval (Val n) = n
eval (Div x y) = eval x `div` eval y
Который выдает ошибку, когда я пытаюсь запустить его. Я не совсем уверен, почему это происходит. Когда я пытаюсь
eval (Val 4) `div` eval (Val 2)
в repl-loop он работает просто отлично, но
eval 4 `div` eval 2
Заканчивается ошибкой вывода типа.
Когда я обновляю свое определение до следующего:
data Expr = Val Int | Div Expr Expr
eval :: Expr -> Int
eval (Val n) = n
eval (Div x y) = eval (Val x) `div` eval (Val y)
Я получаю ошибку типа в определении. Что не так с первым определением? Кстати, в курсе используются объятия.