Como posso evitar escrever código clichê para funções que executam a correspondência de padrões?

Emessa resposta paraoutra pergunta, foi dado um pequeno esboço de código Haskell que usa funções de wrapper para fatorar algum código para fazer a verificação de sintaxe em argumentos de linha de comando. Aqui está a parte do código que estou tentando simplificar:

<code>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
</code>

Existe uma maneira (talvez usandoTemplate Haskell?) para evitar a necessidade de escrever funções extras para cada número de argumentos? Idealmente, eu gostaria de poder escrever algo como (estou fazendo esta sintaxe)

<code>generateArgumentWrapper<2, showUsageMessage>
</code>

E isso se expande para

<code>\fn args -> case args of
                 [a, b] -> fn a b
                 _      -> showUsageMessage
</code>

Idealmente, eu poderia até ter um número variável de argumentos para ogenerateArgumentWrapper meta-função, para que eu pudesse fazer

<code>generateArgumentWrapper<2, asInt, asFilePath, showUsageMessage>
</code>

E isso se expande para

<code>\fn args -> case args of
                 [a, b] -> fn (asInt a) (asFilePath b)
                 _      -> showUsageMessage
</code>

Alguém está ciente de uma maneira de conseguir isso? Seria uma maneira muito fácil de ligar argumentos de linha de comando ([String]) para funções arbitrárias. Ou há talvez uma abordagem totalmente diferente e melhor?

questionAnswers(3)

yourAnswerToTheQuestion