In this response a another question, è stato fornito un piccolo schizzo del codice Haskell che utilizza le funzioni wrapper per calcolare il codice per eseguire il controllo della sintassi sugli argomenti della riga di comando. Ecco la parte del codice che sto cercando di semplificare:Come evitare la scrittura del codice di codice per le funzioni che eseguono la corrispondenza del modello?
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
C'è un modo (magari usando Template Haskell?) Per evitare di dover scrivere funzioni extra per ogni numero di argomenti? Idealmente, mi piacerebbe essere in grado di scrivere qualcosa di simile (sto facendo questa sintassi up)
generateArgumentWrapper<2, showUsageMessage>
E che si espande a
\fn args -> case args of
[a, b] -> fn a b
_ -> showUsageMessage
Idealmente, avrei potuto anche avere un numero variabile di argomenti della meta-funzione di generateArgumentWrapper
, in modo che potessi fare
generateArgumentWrapper<2, asInt, asFilePath, showUsageMessage>
E che si espande a
\fn args -> case args of
[a, b] -> fn (asInt a) (asFilePath b)
_ -> showUsageMessage
Qualcuno è a conoscenza di un modo per raggiungere questo obiettivo? Sarebbe un modo davvero semplice per legare gli argomenti della riga di comando() a funzioni arbitrarie. O forse esiste un approccio totalmente diverso e migliore?
Vedere anche Text.Stampa nella libreria standard, che fa la stessa cosa, più o meno. Si noti che fornire il numero sbagliato di argomenti è un errore di runtime, non un errore di tipo. –