在阅读真实世界的Haskell时,我想出了这个说明:
ghci> :info (+)
class (Eq a, Show a) => Num a where
(+) :: a -> a -> a
...
-- Defined in GHC.Num
infixl 6 +
Run Code Online (Sandbox Code Playgroud)
但是Haskell如何定义+
为非本机函数?在某种程度上,你必须说2 + 3
它将成为汇编程序,即机器代码.
aug*_*tss 21
该+
函数是重载的,对于某些类型,如Int
和Double
定义+
类似
instance Num Int where
x + y = primAddInt x y
Run Code Online (Sandbox Code Playgroud)
primAddInt
编译器知道的函数在哪里,并为其生成机器代码.
这看起来和工作原理的细节取决于您正在查看的Haskell实现.
事实上,可以在没有任何原生基元的情况下定义数字.有很多方法,但最简单的是:
data Peano = Z | S Peano
Run Code Online (Sandbox Code Playgroud)
然后,您可以instance Num
使用模式匹配来定义此类型.数字的第二个常见表示是所谓的仅使用函数的教会编码(所有数字将由一些不起眼的函数表示,+将'将两个函数加在一起形成第三个函数).
确实可能有非常有趣的编码.例如,您可以使用位序列表示[0,1)中的任意精度实数:
data RealReal = RealReal Bool RealReal | RealEnd
Run Code Online (Sandbox Code Playgroud)
在GHC中,当然它是通过使用基元或FFI以机器特定的方式定义的.