[英]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 如何決定使用哪個讀取實例?
這是由 Haskell對Num
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.