Haskell如何实际定义+函数?

Dan*_*ath 10 haskell

在阅读真实世界的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

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

instance Num Int where
    x + y = primAddInt x y
Run Code Online (Sandbox Code Playgroud)

primAddInt编译器知道的函数在哪里,并为其生成机器代码.

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

  • 在GHC中,相应的函数是`+#:: Int# - > Int# - > Int #`.因此,实现类似于"我#a + I#b = I#(a + #b)" (6认同)

npo*_*cop 5

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

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以机器特定的方式定义的.

  • 假设您要查看位的某些初始段,那么您将遇到故障定义添加,因为您无法限制前瞻以确定进位.例如,0.010101 ...... + 0.0010101 ......之后的第一个是什么?你必须看起来无限远才能确定它.这意味着加法甚至不能产生一点结果. (6认同)