Поддерживает ли Dart функциональное программирование?

позволяет ли язык Google Dart функциональное программирование? В частности, поддерживаются ли следующие функции?

  • функции, хранящиеся как переменные (ссылки),
  • функциональные выделки,
  • ленивый параметров

другие особенности функционального программирования?

похоже, что Dart не поддерживает неизменяемые данные.

5 ответов


Dart имеет первоклассные функции и поддерживает множество функциональных конструкций программирования. Вот несколько примеров назначения функций переменным и функции Карри:

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
}

как и ожидалось, это производит:

14
7
5

Я не считаю, что ленивые параметры возможны, и вы уже отметили, что есть явно изменяемые данные.


зависит от того, что вы подразумеваете под "функциональное программирование". Функции-это первоклассные объекты, которые охватывают точку 1, есть Function.apply что позволяет реализовать карриинг себя, так что охватывает пункт 2, но кроме этого, Dart не очень функциональный (неизменность-нет, ссылочная прозрачность-нет, ленивая оценка-нет, что еще у вас есть-вероятно, также нет).


небольшой пример о неизменности:

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
}

вы можете использовать FP с Дротиком или даже языками без типов или неизменяемости, таких как JS. это просто стиль, он не требует родной реализации на языке.

С такими языками, как парадигмы Scala FP, обычно реализуются с системой типов, поэтому она более ограничительна и сложнее непреднамеренно нарушать. Но в то же время вы требуете от пользователя lib специализированных знаний действительно сложных система типов, иногда теория категорий-в противном случае очень трудно извлечь выгоду из знания того, что эта вещь "монада" или "моноид" или что-то еще. Я могу использовать списки, не зная, что это монады или действительно полезная концепция "будущего" в Dart. Когда вы реализуете FP без "магии типа", это часто яснее и более доступно для понимания средним разработчиком. Но в то же время наличие мощной системы типов может помочь компилятору выполнить расширенную оптимизацию кода и включить лучший статический код анализ.

Теория категорий для программистов JavaScript - стоит смотреть.

добавлено: теперь коллекции UnmodifiableListView UnmodifiableMapBase UnmodifiableMapView


к вашей последней точке, неизменности, см.:

которые обеспечивают поддержку библиотеки и codegen для неизменяемых коллекций и"типов значений". Они помогают преодолеть разрыв между 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!');

где "узел" и "updatedNode"являются неизменяемыми. Подробнее в этой статье:built_value для неизменяемых объектных моделей.


пакет, который улучшает опыт Dart FP дальше https://github.com/vsavkin/fpdart

открытая проблема о хвостовой рекурсии https://code.google.com/p/dart/issues/detail?id=29