2010-12-14 60 views
6

Tôi đang đối mặt với nhiệm vụ triển khai các thuật toán (chủ yếu là kiểu logic nghiệp vụ) được biểu diễn dưới dạng sơ đồ khối. Tôi biết rằng flowcharts không phải là đại diện thuật toán tốt nhất do tài sản mã spaghetti của nó (đây sẽ là một trường hợp sử dụng cho CPS?), Nhưng tôi bị mắc kẹt với các đặc điểm kỹ thuật thể hiện như flowcharts.Trình bày các thuật toán được chỉ định Sơ đồ khối trong Haskell

Mặc dù tôi có thể chuyển đổi sơ đồ thành các biểu diễn tương đương phù hợp hơn trước khi triển khai chúng, điều đó có thể khiến bạn khó nhận ra biểu đồ lưu lượng ban đầu trong quá trình thực hiện kết quả, vì vậy tôi hy vọng có một cách để biểu diễn trực tiếp sơ đồ các thuật toán như EDSLs (có thể đơn nguyên) trong Haskell, do đó, sự tương quan với đặc tả lưu đồ ban đầu sẽ là (rõ ràng hơn).

Trả lời

4

Một biểu diễn có thể có của sơ đồ là sử dụng một nhóm các hàm đệ quy đuôi kép, bằng cách dịch "chuyển sang bước X" thành "hàm đánh giá X với trạng thái S". Để cải thiện khả năng đọc, bạn có thể kết hợp thành một hàm duy nhất cho cả hành động (hàm ngoài thay đổi trạng thái) và chuỗi if/else hoặc khớp mẫu giúp xác định bước cần thực hiện tiếp theo.

Đây là giả định, tất nhiên, lưu đồ của bạn phải được mã hóa cứng (trái với tải tại thời gian chạy từ nguồn bên ngoài).

+0

tốt, tôi đã không viết nó trong câu hỏi ban đầu, nhưng đó là cách tôi đang làm nó bây giờ thiếu ý tưởng tốt hơn (mà tôi có thể làm bằng bất kỳ ngôn ngữ nào với hỗ trợ đệ quy đuôi), tôi đã hy vọng có một cái gì đó nhiều hơn Haskell-ish; và có, chúng được cho là được mã hóa cứng – hvr

+0

@ hvr, tôi nghĩ ý tưởng này là sạch và mã hóa khá trực tiếp. Bạn đã xác định mình ra khỏi một giải pháp Haskellish, bởi vì các chương trình Haskellish không nghĩ về lưu lượng điều khiển. – luqui

1

Âm thanh như Arrows sẽ khớp chính xác với những gì bạn mô tả. Hoặc là hình dung các mũi tên (nên khá đơn giản) hoặc tạo/chuyển đổi mã mũi tên từ biểu đồ luồng nếu bạn phải.

+1

Tôi sẽ cảnh giác với các mũi tên ở đây - sơ đồ là dành cho * luồng điều khiển * - mũi tên chụp * luồng dữ liệu *. – sclv

1

Giả sử có trạng thái "toàn cầu" trong sơ đồ, điều đó có ý nghĩa khi đóng gói thành một đơn vị trạng thái. Ít nhất thì, không giống như cách bạn đang thực hiện nó, mỗi cuộc gọi không cần bất kỳ tham số nào, vì vậy có thể được đọc dưới dạng a) sửa đổi trạng thái, b) có điều kiện về trạng thái hiện tại, nhảy.

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