Đây có phải là mẫu thiết kế hợp lệ cho chức năng chính của Haskell không?


8

Sau khi phát triển một số ứng dụng Haskell, tôi thấy mình tách biệt nghiêm ngặt mã không tinh khiết và các hàm có sẵn ( một phần ) từ các đối tác thuần túy và tổng số của chúng. Những nỗ lực này đã giảm đáng kể chi phí bảo trì liên quan đến các ứng dụng. Tôi đã thấy mình theo thời gian dựa vào cùng một maincấu trúc cấp cao để thực thi sự phân biệt này.

Nói chung, tôi mainsẽ có cấu trúc như sau:

import System.Environment

data ProgramParameters = P ()
data ComputationResult = I ()

main :: IO ()
main = getArgs                           -- Collect arguments
   >>= andOrGetUserInput                 -- Collect user input
   >>= impureOrFailableComputations      -- Possible non-recoverable error(s)
   >>= either                            -- "Branch"
         putStrLn                        -- Print Any Failure(s)
         pureNotFailableComputations     -- Finish the work

andOrGetUserInput :: [String] -> IO ProgramParameters
andOrGetUserInput = undefined

impureOrFailableComputations :: ProgramParameters -> IO (Either String ComputationResult)
impureOrFailableComputations = undefined -- a composition of partial functions
                                         -- made total by catching exceptions & input errors
                                         -- in the short-circuiting ErrorT/EitherT monad

pureNotFailableComputations :: ComputationResult -> IO ()
pureNotFailableComputations = undefined  -- a composition of total functions

Mục tiêu là kết hợp các tính toán một phần trong một đơn nguyên, tạo ra một tính toán tổng thể đơn trị.

Điều này đã trở thành một mẫu trong cơ sở mã và tôi muốn phản hồi về việc đây là mẫu thiết kế hay mẫu chống .

  • Đây có phải là một cách thành ngữ để tách riêng và bắt các tính toán một phần?

  • Có những hạn chế đáng chú ý đối với sự phân biệt cấp cao này?

  • Có kỹ thuật trừu tượng tốt hơn?

Câu trả lời:


7

Thiết kế này đưa ra một số giả định không tầm thường:

  • Đầu vào của người dùng sẽ không phụ thuộc vào kết quả tính toán thuần túy hoặc không tinh khiết.

  • Các tính toán không tinh khiết sẽ không phụ thuộc vào kết quả của các tính toán thuần túy.

  • Logic chương trình sẽ không lặp; Nó sẽ chỉ chạy một lần.

Nhận xét khác của tôi về cấu trúc của bạn là bạn không cần tách các tính toán thuần túy và không tinh khiết. Hệ thống loại của Haskell đã làm điều đó cho bạn.

Điều đó nói rằng, cấu trúc này chắc chắn có vẻ hữu ích cho một số loại chương trình nhất định, đặc biệt nếu bạn chắc chắn các giả định tôi nêu ở trên thực sự đúng với chương trình của bạn. Tuy nhiên, đó không phải là thứ mà mọi chương trình nên sử dụng.


Ngoài ra, nếu bạn muốn đơn giản hóa mô hình của mình, hãy xem xét điều đó vàOrGetUserInput gần như chắc chắn được tính là một tạp chí không hoàn hảo. Bạn có thể kết hợp chúng thành một phần.
WolfeFan

Trong thực tế, chúng được ngưng tụ; để trình diễn & giải trình, tôi tách chúng ra.
đệ quy.ninja
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.