В этом ответе на другой вопрос был дан небольшой набросок кода на 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]
) к произвольным функциям. Или, может быть, есть совершенно другой, лучший подход?