¿Cómo puedo evitar escribir código repetitivo para funciones que realizan la comparación de patrones?

Enesta respuesta aotra pregunta, se dio un pequeño boceto de código de Haskell que utiliza funciones de envoltorio para factorizar el código para realizar la comprobación de sintaxis en los argumentos de la línea de comando. Aquí está la parte del código que estoy tratando de 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>

¿Hay una manera (tal vez usandoPlantilla haskell?) para evitar tener que escribir funciones adicionales para cada número de argumentos? Idealmente, me gustaría poder escribir algo como (estoy inventando esta sintaxis)

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

Y eso se expande a

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

Idealmente, incluso podría tener un número variable de argumentos para elgenerateArgumentWrapper meta-función, para que yo pudiera hacer

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

Y eso se expande a

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

¿Alguien es consciente de una manera de lograr esto? Sería una forma realmente fácil de vincular los argumentos de la línea de comandos ([String]) a funciones arbitrarias. ¿O hay tal vez un enfoque totalmente diferente, mejor?

Respuestas a la pregunta(3)

Su respuesta a la pregunta