Как избежать написания шаблонного кода для функций, выполняющих сопоставление с образцом?

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

10
задан Community 23 May 2017 в 12:20
поделиться