我正在用 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)
这似乎有点丑陋。是否有某种惯用的方法来做到这一点?那么错误检查呢?我的函数无法优雅地处理错误,例如以愚蠢的顺序传递参数。
此外,重要的是,调度中的每个函数都接受不同数量的参数,所以无论如何我都不能静态地执行此操作(如上所述)。这太糟糕了unCurry command args
不是有效的 Haskell。