Một cách tốt để thiết kế / cấu trúc các chương trình chức năng lớn, đặc biệt là trong Haskell là gì?
Tôi đã trải qua một loạt các hướng dẫn (Viết cho mình một Đề án là sở thích của tôi, với Real World Haskell một giây) - nhưng hầu hết các chương trình đều tương đối nhỏ và đơn mục đích. Ngoài ra, tôi không coi một số trong số chúng là đặc biệt thanh lịch (ví dụ: các bảng tra cứu rộng lớn trong WYAS).
Bây giờ tôi muốn viết các chương trình lớn hơn, với nhiều phần chuyển động hơn - thu thập dữ liệu từ nhiều nguồn khác nhau, làm sạch nó, xử lý nó theo nhiều cách khác nhau, hiển thị nó trong giao diện người dùng, duy trì nó, giao tiếp qua mạng, v.v. một cấu trúc tốt nhất như vậy để dễ đọc, có thể duy trì và thích ứng với các yêu cầu thay đổi?
Có một tài liệu khá lớn giải quyết những câu hỏi này cho các chương trình mệnh lệnh hướng đối tượng lớn. Các ý tưởng như MVC, các mẫu thiết kế, v.v. là những quy định hợp lý để hiện thực hóa các mục tiêu rộng lớn như phân tách các mối quan tâm và tái sử dụng theo kiểu OO. Ngoài ra, các ngôn ngữ mệnh lệnh mới hơn cho vay theo kiểu 'thiết kế khi bạn phát triển', theo quan điểm mới của tôi, Haskell có vẻ ít phù hợp hơn.
Có một tài liệu tương đương cho Haskell? Làm thế nào sở thú của các cấu trúc điều khiển kỳ lạ có sẵn trong lập trình chức năng (đơn nguyên, mũi tên, ứng dụng, v.v.) được sử dụng tốt nhất cho mục đích này? Những thực hành tốt nhất bạn có thể đề nghị?
Cảm ơn!
EDIT (đây là phần tiếp theo câu trả lời của Don Stewart):
@dons đã đề cập: "Monads nắm bắt các thiết kế kiến trúc quan trọng trong các loại."
Tôi đoán câu hỏi của tôi là: làm thế nào người ta nên nghĩ về các thiết kế kiến trúc quan trọng trong một ngôn ngữ chức năng thuần túy?
Xem xét ví dụ về một số luồng dữ liệu và một số bước xử lý. Tôi có thể viết các trình phân tích cú pháp mô đun cho các luồng dữ liệu vào một tập hợp các cấu trúc dữ liệu và tôi có thể thực hiện mỗi bước xử lý như một hàm thuần túy. Các bước xử lý cần thiết cho một phần dữ liệu sẽ phụ thuộc vào giá trị của nó và các phần khác. Một số bước nên được theo sau bởi các hiệu ứng phụ như cập nhật GUI hoặc truy vấn cơ sở dữ liệu.
Cách 'đúng' để buộc dữ liệu và các bước phân tích cú pháp theo cách hay? Người ta có thể viết một hàm lớn thực hiện đúng các loại dữ liệu khác nhau. Hoặc người ta có thể sử dụng một đơn nguyên để theo dõi những gì đã được xử lý cho đến nay và mỗi bước xử lý có được bất cứ thứ gì nó cần tiếp theo từ trạng thái đơn nguyên. Hoặc người ta có thể viết phần lớn các chương trình riêng biệt và gửi tin nhắn xung quanh (Tôi không thích tùy chọn này).
Các slide mà anh ta liên kết có một viên đạn Things Things Need: "Thành ngữ cho thiết kế ánh xạ vào các loại / hàm / lớp / monads". Các thành ngữ là gì? :)