Câu hỏi kiểu này nhiều hơn là cách thực hiện.Haskell: Phân tích cú pháp đối số dòng lệnh
Vì vậy, tôi đã có một chương trình cần hai đối số dòng lệnh: một chuỗi và một số nguyên.
tôi thực hiện nó theo cách này:
main = do
[email protected](~(aString : aInteger : [])) <- getArgs
let [email protected](~[(n,_)]) = reads aInteger
if length args /= 2 || L.null parsed
then do
name <- getProgName
hPutStrLn stderr $ "usage: " ++ name ++ " <string> <integer>"
exitFailure
else do
doStuffWith aString n
Trong khi làm việc này, đây là lần đầu tiên tôi đã thực sự sử dụng args dòng lệnh trong Haskell, vì vậy tôi không chắc chắn cho dù đây là một khủng khiếp vụng về và cách không thể đọc được để làm những gì tôi muốn.
Sử dụng các công cụ so khớp mẫu phù hợp, nhưng tôi có thể thấy cách các trình lập trình khác cau mày. Và việc sử dụng số lần đọc để xem liệu tôi có phân tích cú pháp thành công chắc chắn cảm thấy khó xử khi viết nó hay không.
Có cách nào thành ngữ hơn để thực hiện việc này không?
Google là bạn của bạn! Đây là cách viết tuyệt vời trên dòng lệnh args trong Haskell: http://leiffrenzel.de/papers/commandline-options-in-haskell.html – Sanjamal
@Sanjamal: Điều đó không đơn giản hóa việc phân tích cú pháp của * đối số *, tuy nhiên, chỉ là lựa chọn. – ehird
bạn cũng có thể thả liên kết 'args' sử dụng một lần bằng cách sử dụng' LambdaCase' cho bạn 'getArgs >> = \ case ...' thay vì 'args <- getArgs; case args of ... ' – rampion