我经常读到懒惰与非严格不一样,但是我很难理解它们之间的区别。它们似乎可以互换使用,但我知道它们具有不同的含义。我希望能帮助您理解其中的区别。
我对此帖子有一些疑问。我将在本文结尾总结这些问题。我有一些示例代码片段,我没有对其进行测试,仅将它们作为概念进行了介绍。我添加了报价,以免您查找报价。也许它将对以后的某个问题有所帮助。
非严格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)
{
int counter = 0;
int result = 1;
while (counter++ < exponent)
{
result = result * number;
yield return result;
}
}
回呼
int f1() { return 1;}
int f2() { return 2;}
int lazy(int (*cb1)(), int (*cb2)() , int x) {
if (x == 0)
return cb1();
else
return cb2();
}
int eager(int e1, int e2, int x) {
if (x == 0)
return e1;
else
return e2;
}
lazy(f1, f2, x);
eager(f1(), f2(), x);
问题
我知道所有这些资源的答案就在我眼前,但我无法把握。似乎该定义很容易被隐含或显而易见地忽略。
我知道我有很多问题。随时回答您认为相关的任何问题。我添加了这些问题进行讨论。
- 是
const1 x = 1
也懒? - 如何从“内向”非严格评估?是因为向内允许减少不必要的表达式,例如in
const1 x = 1
?减少似乎符合懒惰的定义。 - 不懒总是意味着的thunk和非严格总是意味着局部的评价?这只是一个概括吗?
- 以下命令性概念是懒惰的,非严格的,两者都是还是都不是?
- 短路
- 使用产量
- 传递回调以延迟或避免执行
- 是懒惰的一个子集不严格或反之亦然,或者是它们相互排斥。例如是有可能是不严格而不懒惰,或懒惰而不非严格?
- Haskell的非严格性是通过懒惰实现的吗?
谢谢你这么!