別の質問へのこの回答では、ラッパー関数を使用してコマンドライン引数の構文チェックを行うためのコードを除外するHaskellコードスケッチが少し与えられました。これが私が単純化しようとしているコードの部分です:
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
引数の数ごとに余分な関数を書く必要を回避する方法はありますか(おそらくテンプレートHaskellを使用していますか?)?理想的には、次のようなものを記述できるようにしたいと思います(私はこの構文を作成しています)
generateArgumentWrapper<2, showUsageMessage>
そしてそれはに拡大します
\fn args -> case args of
[a, b] -> fn a b
_ -> showUsageMessage
generateArgumentWrapper
理想的には、メタ関数に対して可変数の引数を持つこともできるので、次のことができます。
generateArgumentWrapper<2, asInt, asFilePath, showUsageMessage>
そしてそれはに拡大します
\fn args -> case args of
[a, b] -> fn (asInt a) (asFilePath b)
_ -> showUsageMessage
誰かがこれを達成する方法を知っていますか?コマンドライン引数([String]
)を任意の関数にバインドするのは本当に簡単な方法です。それとも、まったく異なる、より良いアプローチがありますか?