Как 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.