Как Haskell фактически определяет функцию +?
При чтении Real Haskell Я придумал эту заметку:
ghci> :info (+)
class (Eq a, Show a) => Num a where
(+) :: a -> a -> a
...
-- Defined in GHC.Num
infixl 6 +
Но как Haskell может определить +
как не-нативную функцию? На некотором уровне вы должны сказать, что 2 + 3
станет ассемблером, то есть машинным кодом.
Ответы
Ответ 1
Функция +
перегружена, а для некоторых типов, таких как Int
и Double
, определение +
- это что-то вроде
instance Num Int where
x + y = primAddInt x y
где primAddInt
- это функция, которую компилятор знает и будет генерировать машинный код для.
Информация о том, как это выглядит и работает, зависит от реализации Haskell, на которую вы смотрите.
Ответ 2
Фактически можно определить числа без ЛЮБЫХ родных примитивов. Существует много способов, но самое простое:
data Peano = Z | S Peano
Затем вы можете определить instance Num
для этого типа, используя сопоставление с образцом. Второе общее представление чисел - это так называемая церковная кодировка, использующая только функции (все числа будут представлены некоторыми неясными функциями, а + будет "добавлять" две функции вместе, чтобы сформировать третий).
Очень интересные кодировки возможны. Например, вы можете представлять произвольные прецизионные значения в [0,1), используя последовательности бит:
data RealReal = RealReal Bool RealReal | RealEnd
В GHC, конечно, он определяется машинным образом, используя либо примитивы, либо FFI.