haskell中的测试模式匹配

时间:2014-10-20 23:51:24

标签: haskell testing pattern-matching

着名的"了解更多好的Haskell"本书包含命令行参数解析的示例:

dispatch :: String -> [String] -> IO ()
dispatch "add" = add
dispatch "view" = view
dispatch "remove" = remove
main = do
   (command:argList) <- getArgs
   dispatch command argList

在模式匹配很简单之前,测试它没有意义,但事情很快变得更加复杂:

main :: IO()
main = getArgs >>= dispatch

dispatch :: [String] -> IO()
dispatch ("add":args) = add args >> list
dispatch ("remove":args) = remove args >> list
dispatch ("view":[]) = list
dispatch [] = list
dispatch _ = usage

现在想法似乎测试每个特定输入样本是否触发正确的模式匹配分支。如果派遣有任何回报,那没问题,但不幸的是。 我的想法是:

  1. 我觉得派遣应该返回&#34;动作&#34;,但再次通过行动匹配似乎很愚蠢:)
  2. 这里可能会滥用模式匹配,虽然它看起来像是一个很好的测试用例。
  3. 可能是代码必须重构以使派遣返回某些内容,这是唯一的方法
  4. 其他东西
  5. 我希望有一个暗示,哪些假设是正确的,哪些假设是正确的。

    提前致谢!

1 个答案:

答案 0 :(得分:0)

如果您继续阅读,LYAH会提供一些有助于提高此计划稳健性的建议 - 特别是使用Maybe monad和lookup

关于您的编号清单:

  1. 如果您定义自己的类型,调度可以返回Action (),但addview等也必须返回Action ()
  2. 我认为模式匹配非常适合这项任务。使用dispatch语言扩展程序可以提高此PatternSynonyms的可读性,该扩展程序自2014年1月20日起在GHC中提供:https://github.com/ghc/ghc/commit/4f8369bf47d27b11415db251e816ef1a2e1eb3d8
  3. 如点 1。,您必须尊重addview等的返回类型
  4. 谁知道!您可以使用QuickCheck进一步测试可能的输入,方法是定义instance Arbitrary Input,但测试{em>所有可能的getLine输入可能需要一段时间...... :-P
  5. 我希望这有帮助