在 Haskell 中,撇号 ' 的含义是什么?

12
有时我会看到以下的代码表达式:
example = example' []

那么这些函数之间有什么不同呢?

foldl
foldl'

请查看我在这里关于中缀运算符的答案:http://stackoverflow.com/a/29894487/1874049 - Michael K.
4个回答

24
'只是另一个类似的标识符字符。foldl'是一个完全独立于foldl的函数; 它也可以被称为strictFold。它之所以这样称呼,是因为它与foldl密切相关:它是foldl的一个变体,其中累加器在每一步都要被计算,以便不会产生大型thunk(延迟计算表达式)。例如,foldl (+) 0 在处理大列表时会造成堆栈溢出,但foldl' (+) 0则不会。
通常情况下,添加'后缀意味着以下三种情况之一:foo'或者是一个帮助定义,用于定义foo;或者是foo的修改版本(例如,statestate'state'' 可以分别表示一个初始状态和两个已更新的版本);或者是foo的严格版本。

6
你在问题发布后不到3分钟就回答了这个问题,几乎用的时间与输入问题一样长。我看到了并且想:“嘿,一个Haskell问题,我可以回答,而且还没有人回答,赚得声望”,于是我开始输入答案,但当一个拥有20k声望值的人发布了和我即将回答的内容一样的答案。专家们应该留下一些问题让我们这样的人回答... :) - Abdulsattar Mohammed
2
@CodingTales,无论如何都要回答!您可以稍微解释一下,多样性总是好的! :) - huon
1
@CodingTales:'20k旅团'往往给出相当简洁的答案;我总是喜欢多解释一些,更温和地引导提问者找到答案,指出陷阱和死胡同。这个特定的问题不太适合这样做,但我相信还会有其他问题!此外,您可以设置Haskell标签的电子邮件通知,我相信在文本文件中具有良好编写的IO aa之间的区别、布局规则和单态限制的解释将有助于您有朝一日击败他们 :-) - yatima2975
@yatima2975 如果你发现有人提问 IO aa 的区别、布局规则或单态限制,请将这些提问者指向先前类似问题的答案,而不是重复回答。 - Daniel Wagner

4

至少在这个上下文中没有什么不同,因为撇号是一个有效的标识符字符(有关详细信息,请参见此答案)。

在标准库中,某些函数的严格版本通常通过撇号与标准(惰性)版本区分开来,例如foldl'(严格)和foldl(惰性)。 这与撇号特殊无关,这只是一个约定。


2
在Haskell中,fold prime只是用来区分标识符的另一个字符,但通常以与数学中使用的方式相同的方式使用。请注意保留HTML标签。

0
有一个Hackage模块(我忘记是哪个)包含了一些成员测试(或其他谓词)的内容。这个测试函数被称为“is”。
foo x | x `is` whatever = ...

为了方便起见,该函数的布尔取反也已提供:

bar x | x `isn't` whatever = ...

当我第一次看到它时,我觉得它非常有趣。撇号只是标识符中的另一个字符。


我还没有找到这个功能的文档,但我刚刚发现了 Haskell 的这个特性:在您的情况下,我猜这个函数实际上被称为 is(没有撇号),并且旨在像这样使用:is x whatever。但是有了撇号,它就可以像您所使用的那样!如果有人能提供任何关于如何详细使用它的链接,那将非常好! - Michael K.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接