在阅读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
将成为汇编程序,即机器代码。
答案 0 :(得分:21)
+
函数已重载,对于某些类型,例如Int
和Double
,+
的定义类似于
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以机器特定的方式定义的。