9

Có ý tưởng: các hàm (trong FP) có thể được tạo thành các cách tương tự như các thành phần trong OOP. Đối với các thành phần trong OOP, chúng ta sử dụng các giao diện. Đối với các chức năng, chúng tôi có thể sử dụng các đại biểu. Mục đích là để đạt được sự phân hủy, mô đun và khả năng thay đổi lẫn nhau. Chúng tôi có thể sử dụng tiêm phụ thuộc để làm cho nó dễ dàng hơn.Phân tách (mô đun) bằng các ngôn ngữ chức năng

Tôi đã cố gắng tìm nội dung nào đó về chủ đề. Không may mắn. Có lẽ vì không có chương trình chức năng đủ lớn để cần điều này? Trong khi tìm kiếm các ứng dụng quy mô doanh nghiệp được viết bằng FP, tôi đã tìm thấy danh sách này. Functional Programming in the Real Worldthis paper. Tôi hy vọng tôi chỉ bỏ lỡ các ứng dụng sát thủ cho FP, mà sẽ đủ lớn để xứng đáng với sự phân hủy.

Câu hỏi: Bạn có thể hiển thị ứng dụng FP thực tế phong phú (tốt nhất là nguồn mở), sử dụng phân tách thành các mô-đun không?

Lời khen thưởng: Mẫu thông thường được sử dụng là gì? Những loại chức năng nào thường bị phân tách thành các mô-đun riêng biệt? Các triển khai có bao giờ được giả lập cho mục đích thử nghiệm không?

+0

Tôi không quen với khái niệm FP được gọi là "đại biểu". Bạn đang đề cập đến cái gì? – Chuck

+0

Đó là khái niệm C#/F #. Chức năng gõ mạnh mẽ - loại chức năng. Tương tự như giao diện với phương thức đơn trong Java. Xem http://msdn.microsoft.com/en-us/library/dd233206.aspx –

+0

Chỉ tìm thấy giấy liên quan thú vị http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.143.2712&rep= rep1 & type = pdfq = chức năng% 20programming% 20decomposition & ei = FY6aTOKvKcbxOf2cxaIP & USG = AFQjCNHZ39lndEyDRhmXzO-7O0s22ZQ1Jg & sig2 = LtfPcDLYIPljaqR6uc-D5A & cad = rja –

Trả lời

5

Một thời gian trước, tôi đã học F # và tự hỏi về cùng một chủ đề, vì vậy tôi đã hỏi về quality open source projects to learn from.

Lý do tại sao bạn không nhìn thấy bất cứ điều gì tương tự như tiêm phụ thuộc trong lập trình hàm là nó chỉ là "tự nhiên", bởi vì bạn "tiêm phụ thuộc" chỉ bằng cách truyền hoặc soạn hàm. Hoặc như bài viết này đặt nó, "Functional dependency injection == currying", nhưng đó chỉ là một cơ chế.

Mocking frameworks là không cần thiết. Nếu bạn cần phải thử một cái gì đó, bạn chỉ cần vượt qua một "sơ khai" chức năng.

Xem thêm this question about real-world Scala applications.

+0

Con trỏ tốt, hướng tốt. Hãy để tôi thảo luận về nó một chút. Có vẻ như bạn đề xuất chuyển thành phần-hàm vào cuộc gọi phương thức gốc. Với hàng trăm thành phần tôi thường sáng tác trong ứng dụng OOP trong thế giới thực, điều đó sẽ rất khó khăn. Bài báo về cà ri gợi ý rằng bạn có thể cho phép ngôn ngữ chọn các thành phần từ ngữ cảnh cục bộ (? Đóng cửa?). Đúng, nhưng tôi chỉ có thể tưởng tượng ra bối cảnh phân cấp. Có lẽ tôi có thể vượt qua trong một cấu trúc có chứa các thành phần được đặt tên (container hiệu quả) và giải quyết các thành phần-chức năng theo tên. Nhưng đó là định vị ràng buộc/dịch vụ trễ. Tôi có đang sáng tạo lại thứ gì đó không? :-D –

+0

@Pavel: thành thật mà nói tôi chưa xây dựng bất cứ thứ gì trong quy mô đó trong FP, nhưng kinh nghiệm của tôi cho đến nay với F # là tôi không cảm thấy cần thiết cho dịch vụ/IoC, và lấy cái này từ ai đó một thực tế IoC junkie trong OOP :-) –

+0

@Pavel: có lẽ đó là bởi vì "phụ thuộc" trong FP thực sự chỉ là các hàm để chúng trở nên chi tiết hơn, tức là thay vì truyền một IRepository đầy đủ, nếu bạn cần lưu một 'Entity 'bạn chỉ cần truyền một hàm' Thực thể -> đơn vị', có thể hoán đổi một cách trivially với bất kỳ thứ gì phù hợp với chữ ký đó. –

4

Hoặc là chúng ta đang nói về các mục đích chéo (có thể: Tôi không quen thuộc với thuật ngữ OOP) hoặc bạn đang thiếu rất nhiều về lập trình hàm. Các mô-đun và trừu tượng (tức là khả năng trao đổi) đã được phát minh cơ bản bằng ngôn ngữ chức năng CLU. Các giấy tờ tinh túy về các loại trừu tượng là số Protection in programming languagesTypes are not sets của James Morris. Sau đó, hầu hết các cải tiến trong hệ thống mô-đun và trừu tượng đều đến từ thế giới lập trình chức năng, thông qua các ngôn ngữ giống như ML.

Ứng dụng sát thủ cho lập trình chức năng thường được cho là thao tác tượng trưng. Hầu hết các trình biên dịch cho các ngôn ngữ chức năng được viết bằng ngôn ngữ chính nó, vì vậy bạn có thể tra cứu nguồn gốc của việc thực hiện ngôn ngữ chức năng yêu thích của bạn. Nhưng khá nhiều chương trình phi thường (chức năng hay không) được viết theo một cách mô-đun ở một mức độ nào đó - có lẽ tôi đang thiếu một cái gì đó về những gì bạn có nghĩa là "phân hủy"? Mô đun sẽ hiển thị rõ hơn và sử dụng các khái niệm nâng cao hơn trong các ngôn ngữ được nhập mạnh mẽ với hệ thống mô-đun nâng cao, chẳng hạn như Standard MLObjective Caml.

+0

Có, tôi vẫn còn mới đối với FP. Không, tôi không có nghĩa là mô-đun là phương tiện bảo vệ (bộ nhớ). Tôi có nghĩa là mô-đun đó là thứ bạn có thể thay thế. Trong các ngôn ngữ gõ mạnh, đó là giao diện của một thành phần. Tôi sẽ xem xét mã của trình biên dịch. Nó dẫn tôi đến các câu hỏi về tính bất biến của FP so với AST và các tác dụng phụ không có FP so với các tệp mã, tôi tự hỏi liệu đó có phải là ví dụ hay về mã FP không. Dù sao cảm ơn rất nhiều. –

+0

@Pavel: Tôi không có nghĩa là bảo vệ bộ nhớ. Tôi đã thảo luận về các mô-đun = các thành phần có thể thay thế và abstraction = replaceability (và mô-đun hệ thống = phần của ngôn ngữ lập trình có liên quan đến các mô-đun). Lập trình chức năng, hệ thống mô-đun và bất biến là các khái niệm trực giao ở mức độ lớn, mặc dù chúng hoạt động tốt với nhau. – Gilles

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