Đối số cho lập trình hàm [đã đóng]


10

Gần đây tôi đã học F # cho vui (Tôi là VB.NET/C# dev) và tôi thực sự thích một số thứ mà nó cung cấp. Về mặt lý thuyết là vậy. Nhưng tôi gặp khó khăn khi nghĩ đến các kịch bản mà tôi sẽ chọn viết mã trong F # thay vì trong C #. Có ý kiến ​​gì không?


2
F#không đại diện đầy đủ của lập trình chức năng. Hãy thử Clojurethay thế.
Công việc

1
Tôi không biết F #, nhưng tôi sử dụng Haskell bất cứ khi nào tôi muốn đầu óc mình nổ tung. Làm việc mọi lúc cho đến nay;)

1
infoq.com/presentations/Are-we-There-Yet-Rich-Hickey là một video tuyệt vời về chủ đề này (OO so với chức năng)
mikera

Một ngôn ngữ chức năng động? Bạn có thể có nhiều như bạn muốn. : P
Erik Phát lại

Câu trả lời:


14

Một vài đối số cho lập trình hàm thuần túy:

  • Việc phân chia nhiệm vụ cho các hệ thống đa lõi ngày nay dễ dàng hơn
  • Dễ dàng hơn để chứng minh chương trình của bạn là chính xác
  • Thành phần chức năng có thể là tuyệt vời, ngắn gọn và mạnh mẽ

Để biết cách xử lý đầy đủ, hãy xem Tại sao vấn đề lập trình chức năngtại sao vấn đề lập trình chức năng lại có vấn đề .


6

Tôi gặp khó khăn khi nghĩ đến các kịch bản mà tôi sẽ chọn viết mã trong F # thay vì trong C #. Có ý kiến ​​gì không?

Từ đây :

Máy chủ không đồng bộ

  • Quy trình công việc không đồng bộ cho IO không đồng bộ.
  • Bộ xử lý hộp thư cho tin nhắn an toàn chủ đề đi qua.
  • Các loại liên minh cho trạng thái máy chủ và danh mục tin nhắn.
  • Khớp mẫu và đệ quy đuôi cho các máy trạng thái.

Siêu lập trình (ví dụ phân tích cú pháp)

  • Trình tạo phân tích cú pháp như fslex và fsyacc.
  • Các trình kết hợp phân tích cú pháp như FParsec.
  • Mô hình hoạt động cho các trình phân tích cú pháp cuộn tay thanh lịch.
  • Kiểu dữ liệu đại số để đại diện cho cây phân tích.
  • Khớp mẫu để thao tác với cây, ví dụ áp dụng các giai đoạn tối ưu hóa.
  • Phản ánh cho việc tạo mã thời gian chạy nhanh.

Máy tính kỹ thuật

  • Các hàm bậc cao hơn cho mã thuật toán thanh lịch và nhanh chóng.
  • Các kiểu dữ liệu đại số và khớp mẫu cho thao tác biểu tượng.
  • Khả năng tương tác cho sự giàu có của các thư viện .NET.
  • Tương tác sử dụng tương tác F #.
  • Biểu thức tính toán cho dữ liệu mát xa.
  • Đơn vị đo lường để cải thiện tính chính xác.

Ứng dụng GUI

  • Mô hình dưới dạng thông điệp không đồng bộ chuyển giữa mã giao diện người dùng và mã logic ứng dụng.
  • Các hàm bậc cao hơn cho phép bạn xác định giao diện người dùng một cách khai báo.

Lập trình logic

  • Bộ sưu tập liên tục để quay lại dễ dàng.
  • Đuôi gọi cho độ tin cậy.
  • Tự động khái quát hóa để lập trình chung dễ dàng.

Kiểm tra

  • Chạy thử nghiệm đơn vị tương tác.
  • BDD có nghĩa là viết một thông dịch viên.
  • Ngôn ngữ kịch bản tốt để viết khai thác kiểm tra và trực quan hóa kết quả.

Hiệu suất

  • inline cho trừu tượng bậc cao miễn phí.
  • Đuôi gọi cho máy trạng thái nhanh.
  • Cấu trúc dữ liệu hoàn toàn chức năng cho độ trễ thấp.
  • Metaprogramming để tạo mã tối ưu hóa.

Tôi sẽ thừa nhận rằng tôi không biết F # hoặc C # nhưng tôi sẽ đề nghị dành một vài ngày trong F # và xem những gì bạn nghĩ. Theo tôi, sử dụng REPL là một chiến thắng lớn trong bất kỳ ngôn ngữ nào hỗ trợ nó
Zachary K

5

Đây là những gì sử dụng lập trình kiểu chức năng cho - trên cơ sở nhiều hơn hoặc ít hơn hàng ngày.

Chúng tôi làm rất nhiều thứ thống kê và tính toán với bộ dữ liệu khá lớn. Dữ liệu được lấy từ cơ sở dữ liệu là - về cơ bản là các đối tượng tĩnh, không thay đổi. Không có lý do để tạo một lớp với các phương thức.

Mỗi giai đoạn tính toán sẽ thêm một số chi tiết bổ sung, nhưng về cơ bản không làm biến đổi đối tượng. Ở phần cuối của đường ống, chúng tôi thực sự đang thực hiện một phép rút gọn để tính tổng và tổng và các thứ khác.

Hãy tưởng tượng điều này.

for data in summarize( enrich( calculate( some_query( criteria() ) ) ) ):
    print data

Mỗi "giai đoạn" của phép tính là một vòng lập trình chức năng thực hiện việc tính toán đọc đơn giản và tạo ra một đối tượng tổng hợp của những thứ khác cộng với kết quả.

(Chúng tôi sử dụng Python, do đó lập trình chức năng sử dụng các hàm tạo.)

Sử dụng các vật thể không trạng thái, bất biến dễ dàng hơn.


Python có tương đương với F # này không? criteria() |> some_query |> calculate |> enrich |> summarizeTôi thấy toán tử đường ống phía trước có thể dẫn đến mã rõ ràng hơn nhưng tôi lạc đề.
ChaosPandion

@ChaosPandion: Đầu tiên, cú pháp đó làm tôi bối rối. Nhưng một số người có vẻ thích nó. Có vô số gói Python. Tôi chắc chắn rằng bạn có thể tìm kiếm điều đó trên SO và tìm câu trả lời.
S.Lott

@Chaos: Không phải tôi biết. thông thường tôi sáng tác mapđể có được hiệu ứng tương tự.
Paul Nathan

4

Về mặt kỹ thuật, nó không phải là một thuộc tính duy nhất của lập trình chức năng và F # không phải là ngôn ngữ chức năng thuần túy. F #, là một trong những hậu duệ ML, cung cấp một kiểu dữ liệu phù hợp và đại số tuyệt vời. Vì vậy, đối với bất kỳ tác vụ nào yêu cầu cấu trúc dữ liệu phức tạp, F # sẽ biểu cảm và dễ sử dụng hơn nhiều so với C #.

Hãy tưởng tượng việc thực hiện một trình biên dịch trong C # và F # - đại diện cho một cây cú pháp trừu tượng và biến đổi nó đơn giản hơn nhiều nếu ngôn ngữ của bạn cung cấp ADT và khớp mẫu.


2

Lý tưởng cho loại giảm bản đồ của đa hệ thống lớn và song song đa lõi lớn. Khá tuyệt vời, xem xét rằng ngày nay các máy chủ cấp nhập cảnh có 48 lõi (96 đếm HT).


2

Nếu bạn muốn có đầy đủ chức năng hãy thử Haskell, Erlang cũng có một số thứ rất tuyệt về nó.

Simon Payton-Jones nói về Haskell, anh ấy muốn có một chương trình rõ ràng không có lỗi, thay vì không có lỗi rõ ràng.

(Tôi có thể đã trích dẫn một chút, nhưng bạn có ý tưởng)

Bằng cách hạn chế các tác dụng phụ, bạn sẽ dễ dàng chứng minh mã của mình là chính xác.


1

Một lợi thế nhất định là nó dễ dàng song song hơn nhiều.


2
Bạn đang nói về độ tinh khiết và một nhược điểm rõ ràng là độ tinh khiết có xu hướng làm cho các chương trình chậm hơn rất nhiều. Vì vậy, song song + tinh khiết không nhất thiết là một điều tốt.
Jon Harrop
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.