Haskell:非严格和懒惰有何区别?
我经常读到懒惰与非严格不一样,但是我很难理解它们之间的区别。它们似乎可以互换使用,但我知道它们具有不同的含义。我希望能帮助您理解其中的区别。 我对此帖子有一些疑问。我将在本文结尾总结这些问题。我有一些示例代码片段,我没有对其进行测试,仅将它们作为概念进行了介绍。我添加了报价,以免您查找报价。也许它将对以后的某个问题有所帮助。 非严格Def: 如果函数f在应用于非终止表达式时也未能终止,则称其为严格函数。换句话说,当f bot的值是|时,f是严格的。。对于大多数编程语言,所有功能都是严格的。但这在Haskell中并非如此。举一个简单的例子,考虑const1,常量1函数,其定义为: const1 x = 1 在Haskell中const1 bot的值是1。从操作上来说,由于const1不需要参数的值,因此它从不尝试对其求值,因此也不会陷入无限终止的计算中。因此,非严格函数也称为“惰性函数”,并说是“懒惰地”或“根据需要”评估其参数。 -一个温柔的介绍哈斯克尔:函数 我真的很喜欢这个定义。这似乎是我了解严格的最佳选择。是const1 x = 1懒惰的呢? 非严格意味着减少(评估的数学术语)从外部进入, 因此,如果您有(a +(b c)),则首先减小+,然后减小内部(b c)。 -哈斯克尔百科:懒惰与非严格 Haskell Wiki确实使我感到困惑。我了解他们在说什么订单,但是我看不到(a+(b*c))如果通过了,将如何严格地评估_|_? 在非严格评估中,不评估函数的参数,除非在函数主体的评估中实际使用了参数。 在教会编码下,运算符的惰性评估映射为功能的非严格评估;因此,非严格评估通常称为“惰性”。许多语言中的布尔表达式使用一种称为短路评估的非严格评估形式,在这种评估中,只要可以确定会产生明确的布尔值,评估就会立即返回,例如,在遇到真值的析取表达式中,或者遇到假的合取表达式,依此类推。条件表达式通常也使用惰性求值,即在得到明确的分支后立即返回求值。 -维基百科:评估策略 懒惰的Def: 另一方面,惰性求值意味着仅在需要表达式的结果时才对表达式求值(请注意从“归约”到“求值”的转变)。因此,当评估引擎看到一个表达式时,它将构建一个thunk数据结构,其中包含评估该表达式所需的任何值以及指向该表达式本身的指针。当实际需要结果时,评估引擎将调用该表达式,然后将结果替换为thunk以供将来参考。... 显然,一个笨拙的表情和一个部分评估的表情之间有很强的对应关系。因此,在大多数情况下,术语“惰性”和“非严格”是同义词。但不完全是。 -哈斯克尔百科:懒惰与非严格 这似乎是Haskell的特定答案。我认为懒惰意味着沉重,非严格意味着部分评估。比较是否简化了?不懒总是意味着的thunk和非严格总是意味着部分评价。 在编程语言理论中,惰性评估或按需调用1是一种评估策略,它会延迟对表达式的评估,直到实际需要其值为止(非严格评估),并且还避免了重复评估(共享)。 -维基百科:懒惰的评估 势在必行的例子 我知道大多数人在学习功能语言时都会说忘记命令式编程。但是,我想知道这些是否属于非严格,懒惰,或者两者兼有?至少它会提供一些熟悉的东西。 短路 f1() || f2() C#,Python和其他具有“ yield”功能的语言 public static IEnumerable Power(int number, int exponent) { …