簡體   English   中英

為什么 Haskell 在讀取 Num 時似乎默認讀取 Int?

[英]Why does Haskell appear to default to reading Int when reading Num?

我沒想到以下代碼可以工作:

foo :: (Num a) => a -> a
foo x = x + x

main = do
    print (foo (read "7"))

因為無法根據代碼完全推斷(閱讀“7”)的類型。 但是 GHC (6.12.3) 不這樣認為並打印 14。

如果將“7”更改為“7.2”,則代碼將失敗並顯示“no parse”。 這里發生了什么? Haskell 如何決定使用哪個讀取實例?

這是由 HaskellNum class 的默認規則引起的。 如果您添加了

default (Double, Integer)

到文件的頂部,然后你會得到以下結果:

main = do
  print (foo (read "7")) -- prints "14.0"
  print (foo (read "7.2")) -- prints "14.2"

簡而言之,默認規則是“嘗試做正確的事情”的一種嘗試,當您的程序中有一個模棱兩可的類型時,您可以避免編譯錯誤。 不幸的是,在這種情況下,它將編譯時錯誤換成了運行時錯誤。

您可以像這樣禁用默認設置:

default ()

這將迫使您通過類型注釋明確消除此類術語的類型:

print (foo (read "7" :: Int))

Int 是此實例中的默認類型。 見秒。 6.3,歧義和類型默認,在 Haskell 的歷史中:懶惰與 Class,

暫無
暫無

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

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