2013-08-22 19 views
23

Khi Rust bị ăn thịt nhiều hơn và nhiều hơn nữa, sự quan tâm của tôi đối với nó bắt đầu châm biếm. Tôi thích thực tế là nó hỗ trợ các loại dữ liệu đại số và kết hợp cụ thể của những người, nhưng có bất kỳ suy nghĩ được thực hiện trên các thành ngữ chức năng khác?Does/Will Rust có hỗ trợ các thành ngữ lập trình chức năng không?

  1. Ví dụ: Có một bộ sưu tập các chức năng lọc/bản đồ/giảm tiêu chuẩn trong thư viện chuẩn hay không và quan trọng hơn, bạn có thể chuỗi/soạn chúng theo cách dễ hiểu cú pháp [1] không?

  2. Vì đã có các phương tiện thanh lịch để sử dụng ADT, làm thế nào về monads, đặc biệt là một số đường cú pháp cho chúng?

[1] Haskell có (.) Và (>>>), phương pháp mở rộng C# và tùy chọn LINQ, D có cú pháp gọi hàm thống nhất.

+1

Kiểm tra macro này có thể lấy được HKT: https://gist.github.com/14427/af90a21b917d2892eace – CMCDragonkai

+0

Điều đó thật ấn tượng! Mặc dù việc đặt tên của các biến kiểu dường như khá tùy ý. Tôi thậm chí không biết rằng bạn có thể có những đặc điểm với các biến kiểu. Đây là một hack tuyệt vời. –

Trả lời

19

Rust không có HKT, nhưng lặp của nó làm hỗ trợ mã hóa trong một phong cách chức năng với chức năng bậc cao (HOF) như map, filter, fold vv với chaining thuận tiện.

Chi tiết khác so với ngôn ngữ chức năng - thường được thu thập rác, trong khi các chương trình Rust xử lý bộ nhớ theo cách xác định, tương tự như C++ RAII - như một phần của luồng chương trình.

Để cho phép chuỗi hiệu quả, các mẫu biểu thức lười trở lại hỗn hợp của HOF riêng lẻ và bạn có thể chuyển kết quả cuối cùng thành dữ liệu (phân bổ và đánh giá trong một bước) bằng cách kết thúc với .to_owned_vec() hoặc .collect() hoặc bất kỳ thứ gì.

Trong một số trường hợp, điều này không cần thiết, mẫu biểu thức được trả lại là bản thân trình lặp và có thể là đủ. Ví dụ, bạn có thể lặp lại điều đó bằng một vòng lặp for hoặc chuyển nó thành một đối số cho một hàm chung.

Xem:

mẫu tương tự có thể xảy ra ở cả C++ 11 (với các thư viện bổ sung) và Rust. Các generics của Rust không mạnh bằng các mẫu C++, nhưng bất biến theo mặc định, cú pháp định hướng biểu thức, các lambdas đa hình, và suy luận kiểu hai chiều tạo cho nó cảm giác gần gũi hơn với một ngôn ngữ chức năng.

Về 'phương pháp mở rộng' và cú pháp cuộc gọi thống nhất, Rust cho phép cách tổ chức mã 'thế giới mở' tương tự. Bạn có thể thêm impl s với nhiều phương thức hơn cho bất kỳ loại nào ở bất kỳ đâu trong thư viện hoặc chương trình hoặc mở rộng các loại hiện có từ các thư viện khác bằng cách triển khai các phương pháp của riêng bạn.

Điều này làm cho việc sử dụng kiểu gọi phương thức có thể chuỗi dễ dàng hơn so với trong C++ (nghĩa là ít cần phải sửa đổi hoặc lấy được các loại).

Ghi nhớ rất nhiều thành ngữ của Haskell phải làm với độ tinh khiết (ví dụ: đơn nguyên IO, thấu kính ..) và Rust là đa mô hình, không thuần túy. Bạn có thể có một hàm thuần túy cho các lợi ích của tính minh bạch tham chiếu ở cấp chương trình, và việc thực hiện nó được đơn giản hóa bởi các biến cục bộ có thể thay đổi được.

+1

Điều này mang tính thông tin và bổ sung cho câu trả lời khác. Nhưng không sử dụng các đặc điểm có nghĩa là bạn giới thiệu tính đa hình thời gian chạy và khả năng không thể so sánh tiềm năng so với D? Tôi thấy rằng bạn có thể tránh nó với các mẫu biểu hiện (gọn gàng!), Nhưng nếu tôi có thể sử dụng các đặc điểm cho cùng một mã, nó sẽ thậm chí còn tuyệt vời hơn ... Dù sao, nó sẽ vẫn vượt trội so với C# 's IEnumerable. –

+2

đặc điểm được sử dụng cho cả thời gian chạy và tính đa hình thời gian biên dịch; chúng giống như các khái niệm C++ được đề xuất (bao gồm các tham số mẫu cho các lỗi biên dịch thời gian tốt hơn), hoặc bạn có thể khởi tạo một 'đối tượng đặc điểm' trong trường hợp đặc điểm được sử dụng để định dạng vtable. Giống như C++, bạn chỉ nhận được vtable nếu bạn yêu cầu nó một cách rõ ràng. –

+0

không giống như C++, (và như Go) các ptrs vtables được mang theo một con trỏ; các cấu trúc cơ bản không chứa bất kỳ thông tin lớp nào. –

15

Ngôn ngữ phải có "loại có loại cao hơn" để hỗ trợ các khái niệm như Functors, Applications và Monads. Nói cách khác, ngôn ngữ phải có khả năng trừu tượng hóa trên các loại * -> *, hoặc các hàm từ kiểu này sang kiểu khác. Rust hiện không hỗ trợ mức trừu tượng này. Nó đã được discussed như một hướng tương lai có thể, nhưng tôi sẽ không mong đợi nó sẽ là một trọng tâm bất cứ lúc nào sớm.

+1

Câu hỏi gì? Có vẻ quan trọng hơn với tôi bây giờ ... –

+0

Aye, http://stackoverflow.com/questions/17054978/composition-operator-and-pipe-forward-operator-in-rust –

+2

C# hỗ trợ Monads thông qua LINQ. IEnumerable và IObservable đều là monadic/linqable. Tuy nhiên C# không hỗ trợ các loại có mức độ cao hơn nên tôi không chắc chắn rằng xác nhận trong câu trả lời này là chính xác. Có lẽ bạn có ý nghĩa cụ thể hơn một chút. – bradgonesurfing