2013-05-25 3 views
9

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

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

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

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

ответ

15

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 

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

5

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

+0

Ссылочная прозрачность - это функция хорошего дизайна, а не язык (да, иногда это принудительно). Точка, вы можете получить 99,9% пути с хорошей практикой программирования, например, только с использованием неизменяемых объектов и т. Д. – EdwardGarson

+0

Я согласен с тем, что вы можете писать Fortran практически на любом языке, но это не главное, не так ли? :-) – Ladicek

+0

Я не уверен, что я следую. Нельзя писать Fortran на любом языке, но только в Fortran вы можете писать Fortran. Вам не хватает того, что даже без поддержки компилятора (или: языка) вы можете гарантировать ссылочную прозрачность. Он превосходит язык. – EdwardGarson

4

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

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, как правило, реализуются с помощью системы типов, поэтому это является более ограничительным и трудным для непреднамеренного нарушения. Но в то же время вы требуете от пользователя пользовательских знаний о действительно сложной системе типов, иногда теории категорий - в противном случае очень сложно извлечь выгоду из того, что эта вещь является «монадой» или «моноидной» или любой другой. Я могу использовать списки, не зная, что это монады или действительно полезная концепция «будущего» в Дарте. Когда вы реализуете FP без «магии типа», это часто становится более понятным и доступным для понимания средним разработчиком. Но в то же время наличие мощной системы типов может помочь компилятору выполнить расширенную оптимизацию кода и обеспечить лучший статический анализ кода.

Category theory for JavaScript programmers - Стоит посмотреть.

добавил: Теперь коллекции имеют UnmodifiableListViewUnmodifiableMapBaseUnmodifiableMapView

+0

«Стиль FP не имеет большого смысла с современными браузерами» ... какая часть не гель точно? – EdwardGarson

+0

@EdwardGarson Последние 4 года показали, что я ошибся: P – JAre

+0

Неверно о чем именно? – EdwardGarson

3

К последней точке, неизменность, см:

которые обеспечивают л Поддержка библиотек и библиотек неизменяемых коллекций и «типы значений». Они помогают преодолеть разрыв между ОО и функциональным программированием, например, позволяя инлайн «обновление» непреложным значение:

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 for Immutable Object Models.

Смежные вопросы