nmd*_*mdr 3 haskell types typeclass
在以下示例中:
> let sum::Num a=> a->a->a; sum a b = a +b
> let partialSum = sum 1
> partialSum 2.0
3.0
Run Code Online (Sandbox Code Playgroud)
在步骤let partialSum = sum 1它会出现一个被解释为整数,但我想的Haskell延迟,直到它可以计算出(其类型类实例以使用,并因此),直到整个表达式是内置的类型.我们可以解释这个,因为最终的结果是分数(3.0)
但是在这一点上let partialSum = sum 1GHCI必须留1 在记忆中,我想知道它是什么呢?
答案可以分为两个部分:
类型类约束被详细描述为记录,并且它们会在需要时自动传递.
数字文字n被翻译成fromInteger n
所以
sum :: Num a => a -> a -> a
sum a b = a + b
Run Code Online (Sandbox Code Playgroud)
会成为:
sum' :: RecordNum a -> a -> a -> a
sum' dict a b = (plus dict) a b
Run Code Online (Sandbox Code Playgroud)
哪里
data RecordNum a = RecordNum
{ plus :: a -> a -> a
; mult :: a -> a -> a
(...)
; fromInteger :: Integer -> a
}
Run Code Online (Sandbox Code Playgroud)
然后
partialSum :: Num a => a -> a
partialSum = sum 1
Run Code Online (Sandbox Code Playgroud)
变
partialSum' :: RecordNum a -> a -> a
partialSum' dict = sum' dict (fromInteger dict 1)
Run Code Online (Sandbox Code Playgroud)
但在这一点上,
let partialSum = sum 1GHCi必须在记忆中保持1
当然,但请记住,Haskell数字文字已经过载.在这种情况下,1存储为fromInteger (1 :: Integer) :: Num a => a.partialSum保持这一点直到它知道a应该是什么.GHCi只保留1了Integer.
| 归档时间: |
|
| 查看次数: |
101 次 |
| 最近记录: |