在this response到another question,给出了一个小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
有没有一种方法(可能使用Template 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]
)绑定到任意函数将是一种非常简单的方法。或者可能有一个完全不同的,更好的方法?
另请参见标准库中的Text.Printf,它或多或少地执行相同的操作。请注意,提供错误数量的参数是运行时错误,而不是类型错误。 – 2012-04-12 13:14:51