在以下示例中:
> let sum::Num a=> a->a->a; sum a b = a +b
> let partialSum = sum 1
> partialSum 2.0
3.0
在步骤let partialSum = sum 1
中,似乎a被解释为Integer,但我认为Haskell将其延迟,直到它可以找出类型(以及因此使用哪个类型类实例),直到构建整个表达式。我们可以解释这个,因为最终的结果是分数(3.0)
但是在这一点上,let partialSum = sum 1
GHCI必须在记忆中保持1
,我想知道它是什么呢?
但在这一点上,
let partialSum = sum 1
GHCi必须在记忆中保持1
当然,但请记住,Haskell数字文字已经过载。在这种情况下,1
存储为fromInteger (1 :: Integer) :: Num a => a
。 partialSum
坚持这一点,直到它知道a
应该是什么。 GHCi只保留1
Integer
。
答案可以分为两个部分:
n
被翻译为fromInteger n
所以
sum :: Num a => a -> a -> a
sum a b = a + b
会成为:
sum' :: RecordNum a -> a -> a -> a
sum' dict a b = (plus dict) a b
哪里
data RecordNum a = RecordNum
{ plus :: a -> a -> a
; mult :: a -> a -> a
(...)
; fromInteger :: Integer -> a
}
然后
partialSum :: Num a => a -> a
partialSum = sum 1
变
partialSum' :: RecordNum a -> a -> a
partialSum' dict = sum' dict (fromInteger dict 1)