[英]Haskell: How is Num held?
在以下示例中:
> 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
,我想知道它是什么呢?
答案可以分為兩個部分:
類型類約束被詳細描述為記錄,並且它們會在需要時自動傳遞。
數字文字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)
但是在這一點上,
let partialSum = sum 1
GHCi必須在內存中保持1
當然,但請記住,Haskell數字文字已經過載。 在這種情況下, 1
被存儲為fromInteger (1 :: Integer) :: Num a => a
。 partialSum
持有到這個直到它知道什么a
應該的。 GHCi僅保留1
Integer
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.