相关疑难解决方法(0)

功能性,声明性和命令式编程

功能,声明和命令式编程这两个术语是什么意思?

paradigms terminology

464
推荐指数
9
解决办法
18万
查看次数

什么是声明性编程?

我一直听到这个词在几个不同的背景下被抛出.它是什么?

glossary programming-languages declarative

186
推荐指数
12
解决办法
10万
查看次数

"纯粹"在"纯函数式语言"中意味着什么?

Haskell被称为"纯函数式语言".

在这种情况下,"纯粹"意味着什么?这对程序员有什么影响?

haskell functional-programming

56
推荐指数
4
解决办法
2万
查看次数

如何在Dart中进行惰性评估?

是否有本机(支持语言)的惰性评估语法?像lazy valScala一样。

我已经浏览了文档,但找不到任何东西。只有一章关于“延迟加载库”,但这不是我要的。

基于这项研究,我倾向于相信(如果我错了,请纠正我)当前没有这种事情。但是,也许您知道将提供该功能的任何计划或功能请求?还是Dart团队考虑并拒绝了它?

如果确实对此没有本地支持,那么实现惰性评估的最佳实践(最佳语法)是什么?一个例子将不胜感激。

编辑:

我正在寻找的功能的优点与其他语言的实现几乎相同:Scalalazy valC#Lazy<T>Hack的__Memorize属性

  1. 简洁的语法
  2. 延迟计算直到需要该值
  3. 缓存结果(需要的惰性)
  4. 不要打破纯粹的功能范式(下面的解释)

一个简单的例子:

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功能,那么我也将拥有支持常量构造函数的语言支持。这是由于以下事实:延迟的求值 …

language-features dart

5
推荐指数
2
解决办法
2146
查看次数

FP 中的不可变状态

在学习有关 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 循环递增累加器相反。原因是这个累加器是一个可变变量。

那个变量永远不会暴露在函数之外,所以为什么要让它不可变呢?

编辑:

似乎最重要的最佳实践是引用透明性而不是严格的不变性,这意味着我们不关心可变状态,只要它不能被客户端代码发现。然而,人们仍然声称,即使可变状态影响局部变量(如我的第一个示例),代码也更具可读性或更易于推理。

就个人而言,我认为循环比递归更具可读性。

所以真正的问题是:为什么使用不可变变量的代码更容易阅读/推理?

functional-programming scala immutability

0
推荐指数
1
解决办法
288
查看次数