如果有人向我解釋下面的情況,我會非常感激。在我看來,好像Haskell準備在從函數返回值時執行某種整型強制。另一方面,我讀過Haskell從不隱式地轉換類型。不強制執行函數返回類型
如果我在GHCI鍵入:
> import Data.Word
> let t :: (Integer, Word32);
t = let { y = fromIntegral (-1) -- line breaks added for readability
; y' :: Integer
; y' = fromIntegral y } in (y', y)
GHCI告訴我晚些時候t = (-1,4294967295)
。但是,如果我特別限制當地y
類型Word32
:
> let t :: (Integer, Word32);
t = let { y :: Word32
; y = fromIntegral (-1) -- line breaks added for readability
; y' :: Integer
; y' = fromIntegral y } in (y', y)
GHCI會告訴我,t = (4294967295,4294967295)
。
我認爲,如果t
的類型聲明explicite爲(Integer, Word32)
,GHCI會得出這樣的結論y' :: Integer
和y :: Word32
因爲函數的結果是(y', y)
。然後,類型定義y :: Word32
將是完全不必要的。
這一切都是在我試圖編寫函數以「安全地」在Integral類成員之間進行轉換時開始的 - 例如, Int - > Word32。當通過1
和Nothing
時,該功能的意思是返回Just 1
,當通過-1
時。
通過SO和互聯網的簡短搜索沒有提供任何解釋。
難道不是因爲(來自整合:b - > c)。 (fromIntegral:a - > b):a - > c'不會導致類型錯誤?如果「中間」類型'b'既不是由輸入也不是由輸出決定的,它是如何挑選的? – gallais
@gallais非常棒!解決方案是[數字類有一個特殊情況](https://www.haskell.org/onlinereport/decls.html#sect4.3.4),它允許編譯器默認'Num b => b'而不顯式類型註釋,默認的'default'是'Integer'。 – Bergi
不錯!感謝您的解釋! – gallais