gpt4 book ai didi

unit-testing - 简单的 Haskell 单元测试

转载 作者:行者123 更新时间:2023-12-03 06:00:20 42 4
gpt4 key购买 nike

我想通过99 Haskell Problems ,我想专注于解决方案,但要进行测试。如果我将第一个问题的解决方案作为 3 行 .hs 文件,

myLast :: [a] -> a
myLast [x] = x
myLast (_:xs) = myLast xs

我可以添加的最少代码量是多少,以便我可以添加内联测试并使用 runhaskell 运行它们?

最佳答案

QuickCheck (它基本上为您生成测试输入)可能是测试纯函数的最佳方法。如果所讨论的函数具有标准库中的类似函数,您可以使用标准函数作为模型来测试您的函数:

{-# LANGUAGE TemplateHaskell #-}

import Test.QuickCheck
import Test.QuickCheck.All

myLast :: [a] -> a
myLast [x] = x
myLast (_:xs) = myLast xs

-- here we specify that 'myLast' should return exactly the same result
-- as 'last' for any given 'xs'
prop_myLast xs = myLast xs == last xs


return [] -- need this for GHC 7.8
-- quickCheckAll generates test cases for all 'prop_*' properties
main = $(quickCheckAll)

如果你运行它,你会得到:

=== prop_myLast on tmp3.hs:12 ===
*** Failed! Exception: 'tmp3.hs:(7,1)-(8,25): Non-exhaustive patterns in function myLast' (after 1 test):
[]
False

因为您的 myLast 不处理 [] 情况(它应该但可能会抛出类似“last”的错误)。但在这里我们可以简单地调整我们的测试,但指定只应使用非空字符串(使用 ==> 组合器):

prop_myLast xs = length xs > 0 ==> myLast xs == last xs

这使得所有 100 个自动生成的测试用例都能通过 myLast:

=== prop_myLast on tmp3.hs:11 ===
+++ OK, passed 100 tests.
True

PS 指定 myLast 行为的另一种方法可能是:

prop_myLast2 x xs = myLast (xs++[x]) == x

或者更好:

prop_myLast3 x xs = x `notElem` xs ==> myLast (xs++[x]) == x

关于unit-testing - 简单的 Haskell 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5683911/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com