从Haskell Quickcheck中获取函数的输出(以及输入)

4
什么是使用QuickCheck输入谓词和测试函数返回的输出元组的最佳方法?
为了测试其他语言中的(2 * 350)个函数(以检查它们是否与模仿的Haskell基本和Prelude函数的行为不同),我的第一个实验是:
- 捕获(QuickCheck) verboseCheck结果字符串的输出 - 对QuickCheck抛出的每个(重新读取的)输入应用Haskell函数,以获取相应的Haskell输出 - 使用这些输入和输出自动检查其他语言中的并行函数,以查看它们是否与Haskell函数的行为不同
例如,要为列表上的函数获取测试数据,可以执行以下操作:
testSet1
  :: (Show a, Testable prop)
  => String -> String -> ([Int] -> a) -> prop -> IO ()
testSet1 folder fname f p = do
  r <- verboseCheckResult p
  let ys =
        ((,) <*> f) . read . listTuple1 <$>
        splitOn ["Passed:"] (tail $ init $ (lines . output) r)
  writeFile (concat [folder, fname, ".txt"]) (show ys)

这种方式对于简单情况来说还不错,但我无法立即找到一种通用的模式来避免为每个类型签名变体编写单独的函数(以生成和捕获输入和输出)。

关键问题在于,read通常需要一些类型信息来解析QuickCheck生成的输入列表,以及它们(QuickCheck结果输出)的字符串化。

也许我采取了错误的方法,有什么想法吗?Template Haskell?


看起来你想减少代码重复。添加第二个示例可能会更具说明性,这样人们可以仅通过阅读代码就能理解问题所在。想象一下,你如何向最聪明的自动重构工具提出问题,而该工具并不理解自然语言。 - Gurkenglas
可能你可以编写一个足够通用的辅助函数,明确地为给定的函数生成一个输入列表(参见 Gen 类型类),然后在不调用 quickCheck 的情况下进行馈送和比较。 - Yuuri
1个回答

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接