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:
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
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)
generateArgumentWrapper<2, showUsageMessage>
E isso se expande para
\fn args -> case args of
[a, b] -> fn a b
_ -> showUsageMessage
Idealmente, eu poderia até ter um número variável de argumentos para ogenerateArgumentWrapper
meta-função, para que eu pudesse fazer
generateArgumentWrapper<2, asInt, asFilePath, showUsageMessage>
E isso se expande para
\fn args -> case args of
[a, b] -> fn (asInt a) (asFilePath b)
_ -> showUsageMessage
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?