gpt4 book ai didi

haskell - 为什么作为值的局部变量的类型会影响函数类型签名中输入变量的类型?

转载 作者:行者123 更新时间:2023-12-04 12:19:09 24 4
gpt4 key购买 nike

Prelude> func f = [(show s, f == s) | s <- [0, 1..10]]
Prelude> :type func
func :: (Num a, Enum a, Show a, Eq a) => a -> [(String, Bool)]
我希望 f只是 Eq a 的一个实例但是所有的类约束都适用于 s也适用于 f因为某些原因。更换 s使用任何常量删除 f 的相关类型约束,并替换 s在等式中删除除 Eq a 之外的所有类约束为 f .
有人可以向我解释为什么作为值的局部变量的类型会影响作为值的输入变量的类型吗?

最佳答案

Eq不存在于真空中。要比较两件事是否相等,你必须有两件事。而且,至关重要的是,这两件事必须属于同一类型。在 Haskell 中,0 == "A"不仅仅是假的;这是一个类型错误。从字面上看是没有意义的。

f == s
当编译器看到这一点时,即使它对 f 的类型一无所知和 s ,它知道什么 (==)是。 (==)是具有以下签名的函数。
(==) :: Eq a => a -> a -> Bool
两个参数的类型相同。所以现在和永远,对于这个表达式的其余类型检查,我们必须有 fs同类型。 s 所需的任何内容也需要 f .和 s[0, 1..10] 取值.您的类型约束如下
  • Num是必需的,因为 s从文字整数列表中获取值。
  • Enum [..] 要求列表枚举语法。
  • Showshow s 要求.
  • Eq f == s 要求平等表达。

  • 现在,如果我们替换 s用常数,我们得到类似的东西
    func f = [(show s, f == 0) | s <- [0, 1..10]]
    现在 f正在与 0 进行比较.它与 s无关. f需要 Eq (对于 (==))和 Num (因为我们正在与零,一个数字进行比较)。 s ,另一方面,需要 Enum , Num , Eq , 和 Show .抽象地说,这实际上应该是一个类型错误,因为我们没有给出关于哪种类型 s 的指示。应该是,而且没有足够的线索来弄清楚。但是 type defaulting开始,我们会得到 Integer从它。

    关于haskell - 为什么作为值的局部变量的类型会影响函数类型签名中输入变量的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68537997/

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