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 main
cấu trúc cấp cao để thực thi sự phân biệt này.
Nói chung, tôi main
sẽ 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?