Ну, вот как определяется класс типов Integral
.Для информации, например, вы можете просто набрать :i Integral
в GHCi .
. Вы получите
class (Real a, Enum a) => Integral a where ...
, что означает любой тип a
, который должен быть Integral
должен быть Real
и Enum
первым.Такова жизнь.
Обратите внимание, что, возможно, у вас совсем немного перепутались ваши типы.Взгляните на
instance Num Expr where
(L x) + (L y) = L (x + y)
(L x) - (L y) = L (x - y)
(L x) * (L y) = L (x * y)
Этот просто позволяет вам добавлять Expr
эссенции, если они заключают простые числа .Я уверен, что ты не хочешь этого.Вы хотите добавить произвольные выражения , и у вас уже есть синтаксис для этого.Это просто
instance Num Expr where
(+) = (:+)
(-) = (:-)
-- ...
Это позволяет писать (L 1) + (L 2)
с совершенно нормальным синтаксисом.Аналогично, eval
должен не только уменьшать выражения, но и давать число, и поэтому иметь тип eval :: Expr -> Integer
.Деление просто в этом отношении
eval (a :/ b) = (eval a) `div` (eval b)
, которое определено, поскольку вы просто делите числа .