В этот ответ на еще один вопрос был предоставлен небольшой эскиз кода Haskell, который использует функции-обертки для выставьте код для проверки синтаксиса в аргументах командной строки. Вот часть кода, которую я пытаюсь упростить:
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
Есть ли способ (возможно, использовать Template Haskell?), чтобы избежать необходимости писать дополнительные функции для каждого числа аргументов? В идеале я хотел бы написать что-то вроде (я делаю этот синтаксис)
generateArgumentWrapper<2, showUsageMessage>
И это расширяется до
\fn args -> case args of
[a, b] -> fn a b
_ -> showUsageMessage
В идеале я мог бы даже иметь переменное количество аргументов в мета-функции generateArgumentWrapper
, чтобы я мог делать
generateArgumentWrapper<2, asInt, asFilePath, showUsageMessage>
И это расширяется до
\fn args -> case args of
[a, b] -> fn (asInt a) (asFilePath b)
_ -> showUsageMessage
Кто-нибудь знает, как это достичь? Было бы очень просто связать аргументы командной строки ([String]
) с произвольными функциями. Или может быть, совсем другой, лучший подход?