簡體   English   中英

Haskell:Num如何舉行?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM