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?