Wie kann ich vermeiden, dass für Funktionen, die Pattern Matching durchführen, Boilerplate-Code geschrieben wird?

Imdiese Antwort zueine andere FrageEs wurde eine kleine Haskell-Codeskizze angegeben, in der mithilfe von Wrapper-Funktionen Code für die Syntaxprüfung von Befehlszeilenargumenten herausgerechnet wird. Hier ist der Teil des Codes, den ich zu vereinfachen versuche:

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

Gibt es einen Weg (vielleicht mitVorlage Haskell?) um zu vermeiden, zusätzliche Funktionen für jede Anzahl von Argumenten schreiben zu müssen? Im Idealfall möchte ich in der Lage sein, so etwas zu schreiben (ich erfinde diese Syntax)

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

Und das erweitert sich zu

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

Im Idealfall könnte ich sogar eine variable Anzahl von Argumenten an diegenerateArgumentWrapper Meta-Funktion, damit ich das machen kann

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

Und das erweitert sich zu

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

Kennt jemand einen Weg, um dies zu erreichen? Es wäre eine sehr einfache Möglichkeit, Kommandozeilenargumente zu binden ([String]) auf beliebige Funktionen. Oder gibt es vielleicht einen ganz anderen, besseren Ansatz?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage