我一直听到这个词在几个不同的背景下被抛出.它是什么?
Haskell被称为"纯函数式语言".
在这种情况下,"纯粹"意味着什么?这对程序员有什么影响?
是否有本机(支持语言)的惰性评估语法?像lazy valScala一样。
我已经浏览了文档,但找不到任何东西。只有一章关于“延迟加载库”,但这不是我要的。
基于这项研究,我倾向于相信(如果我错了,请纠正我)当前没有这种事情。但是,也许您知道将提供该功能的任何计划或功能请求?还是Dart团队考虑并拒绝了它?
如果确实对此没有本地支持,那么实现惰性评估的最佳实践(最佳语法)是什么?一个例子将不胜感激。
编辑:
我正在寻找的功能的优点与其他语言的实现几乎相同:Scalalazy val或C#Lazy<T>或Hack的__Memorize属性:
一个简单的例子:
class Fibonacci {
final int n;
int _res = null;
int get result {
if (null == _res) {
_res = _compute(this.n);
}
return _res;
}
Fibonacci(this.n);
int _compute(n) {
// ...
}
}
main(List<String> args) async {
print(new Fibonacci(5).result);
print(new Fibonacci(9).result);
}
Run Code Online (Sandbox Code Playgroud)
吸气剂非常冗长,并且具有重复的代码。此外,我无法创建构造函数,const因为_res必须根据需要计算缓存变量。我想像一下,如果我具有类似Scala的lazy功能,那么我也将拥有支持常量构造函数的语言支持。这是由于以下事实:延迟的求值 …
在学习有关 Scala 的一些教程时,我想到了这个问题,但我认为一般来说,在函数式编程方面很有趣。
我不确定 FP 中不变性的重要性。我可以想到两种不同的情况:
1) 类方法不返回实际字段,而是返回它们的副本。例如,如果我们有一个需要保持不可变的类 Dog,那么它的功能:
getToys() { return new ArrayList(this.toys); }
Run Code Online (Sandbox Code Playgroud)
代替:
getToys() { return this.toys; }
Run Code Online (Sandbox Code Playgroud)
这种情况对我来说很有意义,在第二种情况下,客户端代码实际上可能会损坏对象。我的怀疑在于第二种情况:
2) 在 Scala 和大多数其他 FP 语言中,我们更喜欢递归调用:
sum(x: List[Int], acc: Int) {
if(x.isEmpty) return acc;
sum(x.tail, acc + x.head);
}
Run Code Online (Sandbox Code Playgroud)
与传统的 for 循环递增累加器相反。原因是这个累加器是一个可变变量。
那个变量永远不会暴露在函数之外,所以为什么要让它不可变呢?
编辑:
似乎最重要的最佳实践是引用透明性而不是严格的不变性,这意味着我们不关心可变状态,只要它不能被客户端代码发现。然而,人们仍然声称,即使可变状态影响局部变量(如我的第一个示例),代码也更具可读性或更易于推理。
就个人而言,我认为循环比递归更具可读性。
所以真正的问题是:为什么使用不可变变量的代码更容易阅读/推理?
dart ×1
declarative ×1
glossary ×1
haskell ×1
immutability ×1
paradigms ×1
scala ×1
terminology ×1