有时我会看到以下的代码表达式:
example = example' []
那么这些函数之间有什么不同呢?
foldl
foldl'
example = example' []
那么这些函数之间有什么不同呢?
foldl
foldl'
'
只是另一个类似的标识符字符。foldl'
是一个完全独立于foldl
的函数; 它也可以被称为strictFold
。它之所以这样称呼,是因为它与foldl
密切相关:它是foldl
的一个变体,其中累加器在每一步都要被计算,以便不会产生大型thunk(延迟计算表达式)。例如,foldl (+) 0
在处理大列表时会造成堆栈溢出,但foldl' (+) 0
则不会。'
后缀意味着以下三种情况之一:foo'
或者是一个帮助定义,用于定义foo
;或者是foo
的修改版本(例如,state
、state'
和state''
可以分别表示一个初始状态和两个已更新的版本);或者是foo
的严格版本。IO a
和a
之间的区别、布局规则和单态限制的解释将有助于您有朝一日击败他们 :-) - yatima2975IO a
和 a
的区别、布局规则或单态限制,请将这些提问者指向先前类似问题的答案,而不是重复回答。 - Daniel Wagner至少在这个上下文中没有什么不同,因为撇号是一个有效的标识符字符(有关详细信息,请参见此答案)。
在标准库中,某些函数的严格版本通常通过撇号与标准(惰性)版本区分开来,例如foldl'
(严格)和foldl
(惰性)。 这与撇号特殊无关,这只是一个约定。
foo x | x `is` whatever = ...
为了方便起见,该函数的布尔取反也已提供:
bar x | x `isn't` whatever = ...
当我第一次看到它时,我觉得它非常有趣。撇号只是标识符中的另一个字符。
is
(没有撇号),并且旨在像这样使用:is x whatever
。但是有了撇号,它就可以像您所使用的那样!如果有人能提供任何关于如何详细使用它的链接,那将非常好! - Michael K.