Dart是否支持函数式编程?

Phi*_*hil 18 functional-programming dart

Google Dart语言是否允许进行函数式编程?特别是,是否支持以下功能?

  • 函数存储为变量(引用),
  • 功能性干燥,
  • 懒惰的参数

函数式编程的其他功能?

看起来Dart不支持不可变数据.

Dar*_*tle 25

Dart具有一流的功能,并支持许多函数式编程结构.以下是将函数赋值给变量和curried函数的一些示例:

main() {
  f1(x) => x * 2;         // Define the function f1
  var f2 = f1;            // Assign f1 to the variable f2
  print(f2(7));           // Feel free to call f2 like any other function

  add(a) => (b) => a + b; // Curried addition
  print(add(3)(4));       // Calling curried addition

  var add3 = add(3);      // Combining the
  print(add3(2));         //  concepts
}
Run Code Online (Sandbox Code Playgroud)

正如所料,这会产生:

14
7
5

我不相信懒惰的参数是可能的,你已经注意到有明显可变的数据.


Lad*_*cek 6

取决于"函数式编程"的含义.函数是第一类对象,它涵盖了第1点,Function.apply它允许你自己实现currying,所以它涵盖了第2点,但除此之外,Dart功能不是很强大(不变性 - 不,参考透明度 - 不,懒惰的评价 - 不,你还有什么 - 可能也没有).

  • 引用透明度是良好设计的一个功能,并不总是语言(是的,有时是被迫的)。重点是,你可以通过良好的编程实践获得 99.9% 的结果,比如只使用不可变对象等。 (2认同)
  • 好的,所以“你几乎可以用任何语言编写 Fortran”是对“真正的程序员不使用 Pascal”的暗示,如果你还没有读过,我全心全意地推荐 ;-) 我们可以争论一整天关于谁没有抓住重点,但这并不有趣,所以我将把它留在这里:确实引用透明度是程序(或程序的一部分)的属性,这一点毫无疑问。同时,能够判断给定的编程语言是否支持您实现它(= 强制执行它,加上可能提供一个逃生舱口)很有用。我想我们都会同意 Dart 没有。 (2认同)

JAr*_*Are 6

关于不变性的小例子:

class Point {
  Point(this.x, this.y);
  int x,y;
  int get sum => x + y;
}
class ImmutablePoint{
  final  int x,y, sum;
  const ImmutablePoint(x,y) :
    this.x = x,this.y = y,this.sum = x + y;
}

class SemiImmutablePoint {
  int _x, _y; // _ -like private but not access protected by the VM.
  SemiImmutablePoint(this._x, this._y);
  int get x => _x;
  int get y => _y;
}

void main() {
  List<int> li = [1,2,3,4,5];
  final List<int> immutableLi = const [1,2,3,4,5];
  li[1] = 10; //ok
  li = [6,7,8]; //ok
  immutableLi[1] = 10; //error because const
  immutableLi = [6,7,8]; //error because final
  var p = new Point(5,10);
  p.x = 10; //ok
  p.sum = 10; // error can't be directly mutated
  var p2 = const ImmutablePoint(5,10); // compile-time constant
  p2.x = 10; //error
}
Run Code Online (Sandbox Code Playgroud)

您可以将FP与Dart或什至没有类型或不变性的语言一起使用,例如JS。它只是一种样式,不需要使用该语言的本地实现。

使用Scala FP这样的语言,FP范式通常是通过类型系统实现的,因此它的限制性更强,更难以无意间被破坏。但是同时,您需要从lib用户那里获得真正复杂类型系统的专业知识,有时还需要类别理论-否则,很难知道这个东西是“ monad”或“ monoid”或其他东西,因此很难从中受益。我可以使用列表,而不必知道这些是Monad还是Dart中“ future”的真正有用的概念。当您在没有“类型魔术”的情况下实现FP时,一般开发人员通常更清楚,更容易掌握。但是同时拥有强大的类型系统可以帮助编译器执行高级代码优化并实现更好的静态代码分析。

JavaScript程序员的分类理论 - 值得一看。

补充:现在收藏有UnmodifiableListView UnmodifiableMapBase UnmodifiableMapView

  • @EdwardGarson最近4年表明我错了:P (2认同)

Dav*_*gan 5

最后一点,不变性,请参阅:

它为不可变集合和“值类型”提供库和代码生成支持。这些有助于弥合 OO 和函数式编程之间的差距,例如允许对不可变值进行内联“更新”:

var node = new Node((b) => b
  ..left.left.left.right.left.right.label = 'I’m a leaf!'
  ..left.left.right.right.label = 'I’m also a leaf!');
var updatedNode = node.rebuild((b) => b
  ..left.left.right.right.label = 'I’m not a leaf any more!'
  ..left.left.right.right.right.label = 'I’m the leaf now!');
Run Code Online (Sandbox Code Playgroud)

其中“node”和“updatedNode”都是不可变的。本文中的更多详细信息:适用于不可变对象模型的 built_value