如果有人向我解释下面的情况,我会非常感激。在我看来,好像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