Поддерживает ли 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