【发布时间】:2012-04-17 19:52:26
【问题描述】:
我正在用 Haskell 编写一个小命令行程序。我需要它根据命令行参数分派到正确的加密函数。我已经做到了这一点,但是我需要将剩余的参数作为参数传递给函数。我读过:
http://learnyouahaskell.com/input-and-output
这让我走到了这一步:
import qualified CaesarCiphers
import qualified ExptCiphers
dispatch::[(String, String->IO ())]
dispatch = [("EEncipher", ExptCiphers.exptEncipherString)
("EDecipher", ExptCiphers.exptDecipherString)
("CEncipher", CaesarCiphers.caesarEncipherString)
("CDecipher", CaesarCiphers.caesarDecipherString)
("CBruteForce", CaesarCiphers.bruteForceCaesar)]
main = do
(command:args) <- getArgs
每个函数都接受一些我在运行时才知道的参数。我如何将它们传递给一个函数,因为它们将被绑定在一个列表中?我只是手动抓取它们吗?喜欢:
exampleFunction (args !! 1) (args !! 2)
这看起来有点难看。是否有某种惯用的方法来做到这一点?那么错误检查呢?我的函数无法优雅地处理错误,例如以愚蠢的顺序传递参数。
另外,重要的是,dispatch 中的每个函数都接受不同数量的参数,所以无论如何我都不能静态地执行此操作(如上所述)。太糟糕了unCurry command args 不是有效的 Haskell。
【问题讨论】:
-
CmdLib 对此问题有一个有趣的解决方案。不过,这并不是要阻止您找到自己的解决方案!