Это скорее вопрос стиля, а не как.
Итак, у меня есть программа, для которой нужны два аргумента командной строки: строка и целое число.
Я реализовал его следующим образом:
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
Пока это работает, это первый раз, когда я действительно использовал аргументы командной строки в Haskell, поэтому я не уверен, что это ужасно неудобный и нечитаемый способ делать то, что я хочу.
Использование ленивого сопоставления шаблонов работает, но я мог видеть, как это может быть недовольным другими кодерами. И использование чтения, чтобы увидеть, если я получил успешный синтаксический анализ, определенно чувствовал себя неловко, когда писал его.
Есть ли более идиоматический способ сделать это?