13

有时我会看到带有以下表达式的代码:

example = example' []

或者这些功能之间有什么不同?

foldl
foldl'
4

4 回答 4

23

'只是另一个标识符字符,就像任何其他字符一样。foldl'是一个完全独立的函数foldl;它也可以称为strictFold. 之所以这样称呼它是因为它与foldl: 它foldl是在每一步都对累加器进行评估的地方,因此不会产生大的 thunk。例如,foldl (+) 0将溢出一个大列表上的堆栈,但foldl' (+) 0不会。

通常,a 的后缀'意味着以下三件事之一:foo'要么是为定义 而制定的辅助定义, (即,,,并且可以是初始状态和两个更新版本)foo的修改版本,或者是严格的的版本。foostatestate'state''foo

于 2012-04-28T11:54:45.917 回答
4

什么都没有,至少在这种情况下没有,因为撇号是一个有效的标识符字符(有关更多详细信息,请参阅此答案。)

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

于 2012-04-28T11:58:09.143 回答
2

在 Haskell 中,它只是区分标识符的另一个字符,然后调用标识符fold prime,但它的常用方式与数学中使用的方式相同。

于 2012-04-28T11:56:20.913 回答
0

有一个 hackage 模块(我忘了是哪个),其中包含某种成员资格测试(或其他谓词)。测试函数称为“is”:

foo x | x `is` whatever = ...

为方便起见,还提供了函数的布尔否定:

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

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

于 2012-05-01T02:44:06.373 回答