gpt4 book ai didi

haskell - Haskell 中 2 + 2.8 的加法

转载 作者:行者123 更新时间:2023-12-02 17:11:03 24 4
gpt4 key购买 nike

表达式 2 + 2.8 在 Haskell 中有效,计算结果为 4.8与涉及类型提升的 C 类似,Haskell 使用类型推断和临时多态性来获取结果。

问题是,无论是什么原因,它都不是两种语言中弱类型的示例。

最佳答案

“弱类型”和“强类型”是有些主观的术语,理性的人通常会不同意它们的确切含义。

C

在 C 中,有 2 个类型为 int ,以及 2.8,其类型为 double 。当您计算2 + 2.8时,应用“通常的算术转换”,这促进了 intdouble 。所以你得到这个:

((double) 2) + 2.8

这会将 2(int )转换为 double 。结果是类型double .

haskell

在 Haskell 中,没有隐式转换。 Haskell 中发生的情况是 2 的类型为 Num a => a 2.8 的类型为 Fractional a => a 。因此 2 + 2.8 的类型为 Fractional a => a .

但是,这是一个问题,因为 Fractional a => a是多态的。您可以将其视为采用零参数的多态函数。您传入一个类型,该函数会生成该类型的值。

所以你可以这样做:

2 + 2.8 :: Rational

或者你可以这样做:

2 + 2.8 :: Double

你会得到不同的答案。当你写2 + 2.8 :: Rational时,那么 2 就是 Rational ,2.8 是 Rational ,整个结果是Rational 。当你写2 + 2.8 :: Double时,那么 2 就是 Double ,2.8 是 Double ,结果为Double 。您没有获得转化。

摘要

你可以这样想:在 Haskell 中,类型检查器知道结果具有类型 T,因此输入也具有类型 T。在 C 中,类型检查器不会像那样“向前看”,因此它必须临时转换类型。

当您执行以下操作时,这一点会更加明显:

1 / 2 + 0.0

在 C 语言中,这将为您提供 0.0,因为 1 / 2是整数除法。在 Haskell 中,这将为您提供 0.5,因为一切都将使用 Double 完成。或Rational或任何你选择的。这是 Haskell 和 C 之间的一个相当大的区别,并且通常是人们在说“强”或“弱”类型时所指的意思(即,当他们甚至可以就其含义达成一致时)。

所以在 C 中,你会得到:

(double) ((int) 1 / (int) 2) + (double) 0.0
// ^^^ intermediate result stays in int

在 Haskell 中,你会得到:

(1 :: Double) / (2 :: Double) + (0.0 :: Double)

如果你想要 Haskell 中类似 C 的行为,你最终会得到这样的结果:

fromIntegral (1 `quot` 2 :: Int) + 0.0 :: Double

关于haskell - Haskell 中 2 + 2.8 的加法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40617439/

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