Haskell如何实际定义+函数?

时间:2011-11-18 14:00:24

标签: haskell

在阅读Real world Haskell时,我想出了这个说明:

ghci> :info (+)
  class (Eq a, Show a) => Num a where
  (+) :: a -> a -> a
  ...
  -- Defined in GHC.Num
  infixl 6 +

但是Haskell如何将+定义为非本机函数?在某种程度上,你必须说2 + 3将成为汇编程序,即机器代码。

2 个答案:

答案 0 :(得分:21)

+函数已重载,对于某些类型,例如IntDouble+的定义类似于

instance Num Int where
    x + y = primAddInt x y

其中primAddInt是编译器知道的函数,并将生成机器代码。

这看起来和工作原理的细节取决于您正在查看的Haskell实现。

答案 1 :(得分:5)

事实上,可以在没有任何原生基元的情况下定义数字。有很多方法,但最简单的是:

data Peano = Z | S Peano

然后,您可以使用模式匹配为此类型定义instance Num。数字的第二个常见表示是所谓的仅使用函数的教会编码(所有数字将由一些模糊函数表示,+将'将两个函数加在一起形成第三个函数)。

确实可能有非常有趣的编码。例如,您可以使用位序列表示[0,1)中的任意精度实数:

data RealReal = RealReal Bool RealReal | RealEnd

在GHC中,当然它是通过使用基元或FFI以机器特定的方式定义的。