gpt4 book ai didi

haskell - 为什么不能在 Haskell 中添加 Int 和 float

转载 作者:行者123 更新时间:2023-12-02 02:48:35 25 4
gpt4 key购买 nike

为什么这行不通:-

(length [1,2,3,4]) + 3.2

虽然这有效:-
2+3.3

我知道在第一种情况下结果是 Int+Float 但在第二种情况下也不一样,或者 Haskell 是否自动推断第二种情况下的类型是 :- Num+Num 而它没有这样做在第一种情况下?

最佳答案

Haskell 永远不会为你做隐式类型转换。 +只适用于相同类型的两个数字,并为您提供该类型作为结果。 + 的任何其他用法是一个错误,正如您在 (length [1,2,3,4]) + 3.2 中看到的那样例子。

然而,数字文字在 Haskell 中被重载。 2可以是任何数字类型,并且 3.3可以是任何小数类型。所以当 Haskell 看到表达式 2 + 3.3它可以尝试找到既是“数字”又是“小数”的类型,并将这两个数字都视为该类型,以便加法起作用。

更准确地说,+有类型 Num a => a -> a -> a . 2本身属于 Num a => a 类型和 3.3本身属于 Fractional a => a 类型.将这 3 种类型放在一起,表达式 2 + 3.3 中的两个数字都可以指定类型 Fractional a => a ,因为所有 Fractional类型也是Num类型,那么这也满足 + 的类型. (如果您将此表达式键入 GHCi,则 a 将填充为 Double ,因为 GHC 必须将类型默认为某些内容才能对其进行评估)

在表达式 (length [1,2,3,4]) + 3.2 中, 3.2仍然重载(并且孤立地将具有类型 Fractional a => a )。但是length [1,2,3,4]有类型 Int .由于一侧是固定的具体类型,唯一满足类型为+的方法将填写a在另一种类型上使用 Int ,但这违反了 Fractional约束; 3.2没有办法成为 Int .所以这个表达式的类型不是很好。

但是,任何 Integral类型(其中 Int 是其中之一)可以转换为任何 Num通过申请输入 fromIntegral (这实际上是如何将诸如 2 之类的整数文字视为任何数字类型)。所以(fromIntegral $ length [1,2,3,4]) + 3.2将工作。

关于haskell - 为什么不能在 Haskell 中添加 Int 和 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18120789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com