gpt4 book ai didi

haskell - 在函数签名中键入变量

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

如果我执行以下操作

functionS (x,y) = y
:t functionS
functionS :: (a, b) -> b

现在有了这个功能:

functionC x y = if (x > y) then True else False
:t function

我希望得到:

functionC :: (Ord a, Ord b) => a -> b -> Bool

但是我得到:

functionC :: Ord a => a -> a -> Bool

GHCI 似乎对前面的 2 个结果没问题,但为什么它给了我第二个?为什么没有定义类型变量 a 和 b?

最佳答案

我认为您可能误读了类型签名。这不是你自己的错——你用来说明你的想法的例子有点令人困惑。特别是,在您的元组示例中

functionS :: (a,b) -> b
functionS (x,y) = y

符号 (_,_) 有两种不同的含义。在第一行中,(a,b) 指的是 type,第一个元素为 a 且第二个元素为 type 的对的类型b。在第二行中,(x,y) 引用一个特定的对,其中x 的类型为a 并且y 的类型为 b。虽然这个“双关语”提供了一个有用的助记符,但在您第一次掌握它时可能会造成混淆。我宁愿 pairs 的类型是常规类型构造函数:

functionS :: Pair a b -> b
functionS (x,y) = y

那么,继续你的问题。在签名中给你

functionC :: Ord a => a -> a -> Bool

a 是一个类型Ord a 表示 a 类型的元素相对于彼此 是可排序的。该函数采用相同 类型的两个参数。一些可排序的类型是 Integer(按数字)、String(按字典顺序)和许多其他类型。这意味着您可以分辨出两个 Integer 中哪个较小,或者两个 String 中哪个较小。然而,我们不一定知道如何判断 Integer 是否小于 String(这很好!你见过什么类型的? shenanigans javascript 必须做些什么才能支持无类型相等性?Haskell 根本不需要解决这个问题!)。所以这就是这个签名所说的——只有一个可排序类型,a,并且该函数采用相同类型的两个元素。

您可能仍然想知道为什么 functionS 的签名有两个不同类型的变量。这是因为没有约束将它们限制为相同,例如必须命令它们相互对抗。 functionS 与两个分量都是整数的对一样,与一个是整数而另一个是字符串的情况同样有效。没关系。而且 Haskell 总是选择最通用有效的类型。因此,如果不强制它们相同,它们就会不同。

有更多的技术方法可以解释这一切,但我觉得直观的解释是合适的。希望对您有所帮助!

关于haskell - 在函数签名中键入变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51604363/

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