Trong this response đến another question, một chút phác thảo mã Haskell đã được đưa ra trong đó sử dụng hàm wrapper để yếu tố ra một số mã để thực hiện kiểm tra cú pháp trên các đối số dòng lệnh. Đây là một phần của mã mà tôi đang cố gắng để đơn giản hóa:Làm cách nào để tránh viết mã bản mẫu cho các chức năng thực hiện khớp mẫu?
takesSingleArg :: (String -> IO()) -> [String] -> IO()
takesSingleArg act [arg] = act arg
takesSingleArg _ _ = showUsageMessage
takesTwoArgs :: (String -> String -> IO()) -> [String] -> IO()
takesTwoArgs act [arg1, arg2] = act arg1 arg2
takesTwoArgs _ _ = showUsageMessage
Có cách nào (có thể sử dụng Template Haskell?) Để tránh phải viết chức năng bổ sung cho mỗi số lập luận? Lý tưởng nhất, tôi muốn để có thể viết một cái gì đó tương tự (Tôi đang làm cú pháp này lên)
generateArgumentWrapper<2, showUsageMessage>
Và đó mở rộng để
\fn args -> case args of
[a, b] -> fn a b
_ -> showUsageMessage
Lý tưởng nhất, tôi thậm chí có thể có một số biến đối số cho các generateArgumentWrapper
meta-chức năng, do đó tôi có thể làm
generateArgumentWrapper<2, asInt, asFilePath, showUsageMessage>
Và đó mở rộng để
\fn args -> case args of
[a, b] -> fn (asInt a) (asFilePath b)
_ -> showUsageMessage
Có ai biết cách để đạt được điều này không? Nó sẽ là một cách thực sự dễ dàng để ràng buộc các đối số dòng lệnh ([String]
) với các hàm tùy ý. Hay liệu có cách tiếp cận hoàn toàn khác, tốt hơn?
Xem thêm Text.Printf trong thư viện chuẩn, thực hiện tương tự, nhiều hay ít. Lưu ý rằng việc cung cấp sai số đối số là lỗi thời gian chạy, không phải là lỗi loại. –