gpt4 book ai didi

haskell - 约束多态: variable vs.函数参数

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

这是一个非常基本的问题。我刚刚开始使用几个不同的来源学习 Haskell。我目前无法从这些中破译一些东西。

以下内容自然会进行类型检查。

g :: Num a => a -> a
g x = x + 2
h = g (1.0 :: Double)

当我将其解释如下时,这个约束多态性的示例对我来说是完全有意义的:只要提供给 g 的参数是具有 Num 的类型例如,一切都很好。

因此,请考虑以下事项。

x :: Num a => a

如果我按上述方式解释,我会得到:x 可以采用具有 Num 实例的类型的任何值。但是,以下内容将不会进行类型检查。

x :: Num a => a
x = (1.0 :: Double)

我的问题是:这里到底有什么区别?

有点了解可能发生的情况:在第二个示例中,定义了x,以便它将计算为任何Num(1.0::Double) 不符合条件。

但我的模糊想法远不能成为完整的解释,我正在寻找更好的解释。

最佳答案

您应该按如下方式读取类型 g::Num a => a -> a:

  • g 的调用者选择类型 a
  • 调用者必须证明a是数字类型
  • 调用者必须提供 a 类型的参数值
  • g 必须使用 a 类型的结果值进行应答

因此,x::Num a => a 变为

  • x 的用户选择类型 a
  • 用户必须证明a是数字类型
  • x 必须使用 a 类型的结果值进行应答

因此,x 不允许选择 a = Doublex 的用户可以选择它。想想例如of (x::Int) + 4:这将进行类型检查,选择 a=Intx 的实现必须是通用的,以便适用于所有数字类型。

顺便请注意,数字文字具有相同的类型 42::Num a => a,这就是为什么我们可以将它们用作 Double,如 Int,或任何其他数字类型。

关于haskell - 约束多态: variable vs.函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44996195/

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