在阅读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
会变成汇编语言即机器码。
在阅读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
会变成汇编语言即机器码。
+
函数是重载的,对于一些类型,比如 Int
和 Double
,+
的定义类似于:
instance Num Int where
x + y = primAddInt x y
在这里,primAddInt
是一个编译器知道并将生成机器代码的函数。
它的具体形式和工作方式取决于您所使用的Haskell实现。
+# :: Int# -> Int# -> Int#
。因此,实现类似于 I# a + I# b = I# (a +# b)
。 - fuz事实上,可以完全不使用任何本地基元来定义数字。有很多方法,但最简单的方法是:
data Peano = Z | S Peano
instance Num
。 数字的第二种常见表示法是使用仅函数的所谓教堂编码(所有数字都将由一些晦涩的函数表示,而+将“添加”两个函数以形成第三个函数)。确实可能存在非常有趣的编码。例如,您可以使用位序列表示[0,1)中的任意精度实数:data RealReal = RealReal Bool RealReal | RealEnd
在GHC中,它当然是通过使用原语或FFI以机器特定的方式来定义的。
RealReal
的定义不是很好。 - augustss