2013-05-25 53 views
9

Ngôn ngữ Google Dart có cho phép lập trình chức năng không? Cụ thể, các tính năng sau có được hỗ trợ không?Dart có hỗ trợ lập trình chức năng không?

  • chức năng lưu trữ như các biến (tài liệu tham khảo),
  • currying chức năng,
  • thông số lười biếng

tính năng khác của lập trình chức năng?

Dường như Dart không hỗ trợ dữ liệu bất biến.

Trả lời

15

Dart có chức năng hạng nhất và hỗ trợ nhiều cấu trúc lập trình hàm. Dưới đây là một số ví dụ về các giao chức năng để biến và của một hàm cà ri:

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 
} 

Đúng như dự đoán, điều này tạo ra:

 
14 
7 
5 

Tôi không tin các thông số lười biếng là có thể, và bạn đã lưu ý rằng có dữ liệu rõ ràng có thể thay đổi.

5

Phụ thuộc vào ý bạn là "lập trình chức năng". Các hàm là các đối tượng hạng nhất, bao gồm điểm 1, có Function.apply cho phép bạn thực hiện tự cắt, để bao gồm điểm 2, nhưng khác hơn, Dart không phải là rất chức năng (không thay đổi - không, minh bạch tham chiếu - không , lười biếng đánh giá - không, những gì khác có bạn - có lẽ cũng không).

+0

Tính minh bạch tham chiếu là chức năng của thiết kế tốt, không phải lúc nào cũng là ngôn ngữ (có, đôi khi bị buộc). Điểm là, bạn có thể nhận được 99,9% cách có thực hành lập trình tốt, như chỉ sử dụng các đối tượng bất biến, v.v. – EdwardGarson

+0

Tôi đồng ý rằng bạn có thể viết Fortran bằng hầu hết mọi ngôn ngữ, nhưng đó không phải là vấn đề, phải không? :-) – Ladicek

+0

Tôi không chắc chắn tôi làm theo. Người ta không thể viết Fortran bằng bất kỳ ngôn ngữ nào, chỉ ở Fortran bạn mới có thể viết Fortran. Bạn đang thiếu điểm mà ngay cả khi không có trình biên dịch (hoặc: ngôn ngữ) hỗ trợ, bạn có thể đảm bảo tính minh bạch tham chiếu. Nó vượt qua ngôn ngữ. – EdwardGarson

4

ví dụ nhỏ về tính bất biến:

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 
} 

Bạn có thể sử dụng FP với Phi tiêu hoặc thậm chí các ngôn ngữ không có loại hoặc bất biến như JS. nó chỉ là một phong cách, nó không yêu cầu thực hiện bản địa trong ngôn ngữ.

Với các ngôn ngữ như mô hình Scala FP thường được triển khai với hệ thống kiểu nên sẽ bị hạn chế và khó khăn hơn để vô tình vi phạm. Nhưng đồng thời bạn yêu cầu kiến ​​thức chuyên môn của người dùng lib về hệ thống kiểu thực sự phức tạp, đôi khi là lý thuyết thể loại - nếu không thì thật khó kiếm được lợi ích khi biết rằng thứ này là "đơn nguyên" hay "monoid" hay gì đó. Tôi có thể sử dụng danh sách mà không biết rằng đó là những monads hoặc khái niệm thực sự hữu ích về "tương lai" trong Dart. Khi bạn triển khai FP mà không có "loại ma thuật", nó thường rõ ràng hơn và dễ nắm bắt hơn bởi một nhà phát triển trung bình. Nhưng đồng thời có hệ thống kiểu mạnh mẽ có thể giúp trình biên dịch thực hiện tối ưu hóa mã nâng cao và cho phép phân tích mã tĩnh tốt hơn.

Category theory for JavaScript programmers - Đáng xem.

thêm: Bây giờ bộ sưu tập có UnmodifiableListViewUnmodifiableMapBaseUnmodifiableMapView

+0

"Phong cách FP không có nhiều ý nghĩa với các công cụ trình duyệt hiện đại" ... phần nào không gel chính xác? – EdwardGarson

+0

@EdwardGarson 4 năm qua đã chỉ ra rằng tôi đã sai: P – JAre

+0

Sai về chính xác những gì? – EdwardGarson

3

Đến thời điểm cuối cùng của bạn, bất biến, xem:

cung cấp l hỗ trợ ibrary và codegen cho các bộ sưu tập không thay đổi và "các loại giá trị". Những sự giúp đỡ thu hẹp khoảng cách giữa OO và lập trình chức năng, ví dụ như cho phép inline "cập nhật" để giá trị bất biến:

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!'); 

đâu "nút" và "updatedNode" đều không thay đổi. Chi tiết hơn trong bài viết này: built_value for Immutable Object Models.

Các vấn đề liên quan