簡體   English   中英

關於Haskell類型類(Num vs Read)

[英]Regarding Haskell type classes (Num vs Read)

有人可以解釋我在這里缺少的東西:

Prelude> :t read
read :: (Read a) => String -> a 
Prelude> read "4"

<interactive>:1:0:
    Ambiguous type variable `a' in the constraint:
      `Read a' arising from a use of `read' at <interactive>:1:0-7
    Probable fix: add a type signature that fixes these type variable(s)

read "4"引發錯誤,因為ghci不知道我們想要哪種具體類型,它只知道我們有一個Read類。 read "4" :: Int工作正常。 這對我來說很清楚。

現在,按照上面的邏輯,我期望從fromIntegral 4中引發一個錯誤:

Prelude> :t fromIntegral
fromIntegral :: (Integral a, Num b) => a -> b
Prelude> fromIntegral 4
4

但是,它工作正常。 為什么在這種情況下不需要類型注釋? 我預計上述情況會失敗; 而且只有

Prelude> fromIntegral 4 :: Int

上班。

注意 - 我正在閱讀“讓你學習哈斯克爾以獲得巨大的利益”並且已經涵蓋到第5章了。我在第7章(或其他章節)中討論的是什么?

謝謝。

它的工作原因是類型默認 ,這會導致模糊類型變量默認為IntegerDouble (或其他一些用戶定義的默認值)。 這只發生在Num及其子類中。

在GHCi中, 放寬默認規則也適用於ShowEqOrd ,並且()也被添加到默認類型列表中。 這允許像[] == []這樣的表達式進行類型檢查。

區別在於read可能會導致任何類型,而fromIntegral會產生一個數字。 關於ghci中的數字有一些默認值,因此ghci可以使用默認類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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