gpt4 book ai didi

haskell - 在 Haskell 中,变量前面的下划线是什么意思?

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

我正在浏览 Data.Foldable 的源代码,在那里我遇到了 Endo #。 f,点击此链接后,遇到:

(#.) _f = coerce

现在,首先,我不知道什么是coerce以及前面提到的Coercible是什么,但是,它让我更困惑_f 可能意味着。我搜索了“变量前的 Haskell 下划线”和类似内容,只找到了有关 _ 模式匹配语法的讨论。

最佳答案

根据 Haskell 规范,它只是变量的另一个可能名称。但事实有点长,因为大多数 Haskell 开发人员专门为 GHC 编写代码,而这就是其中之一。

GHC 有很多有用的警告;一是当您编写绑定(bind)函数体中未使用的变量的模式时发出警告。它非常方便,并且发现了我的一些错误。但是,它会产生链式 react :如果您编写的函数仅在一个子句或另一个子句中使用某些变量,您会收到警告。例如,以下是列表上 foldr 的非常自然的定义:

 foldr f z [] = z
foldr f z (x:xs) = x `f` foldr f z xs

哎呀!我们在第一个子句中没有使用 f,因此我们会收到警告。好的,修复起来很容易:

foldr _ z [] = z
foldr f z (x:xs) = x `f` foldr f z xs

不幸的是,现在我们已经丢失了有关第一个变量在代码中的作用的信息。在这种情况下,foldr 是如此熟悉,因此没有什么大的损失,但在不熟悉的代码库中,函数需要大量参数,知道每个“漏洞”忽略了哪些数据可能会很好。因此,GHC 添加了一条特殊规则:有关未使用变量的警告不会警告您以 _ 开头的变量名称 - 类似于 _ 模式,它也不会警告您不警告你。所以现在我可以写:

foldr _f z [] = z
foldr f z (x:xs) = x `f` foldr f z xs

现在我得到了两全其美的效果:如果我忘记使用我绑定(bind)的变量,我会收到一个很好的警告,并且我仍然可以向读者提供有关我不需要的模式中的孔的含义的信息当前条款。 (作为旁注,如果我确实错误地使用了以_开头的变量,我希望有一个额外的警告报告,但我认为它不存在于这听起来很愚蠢(“只是不要在函数体中输入 _”),但我发现编辑器的制表符补全功能偶尔会为我插入它们,而且很容易不这样做注意您是否编码速度很快。)

关于haskell - 在 Haskell 中,变量前面的下划线是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50705757/

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