如何将 QuickCheck 参数限制为非空字符串列表?

How can I constrain a QuickCheck parameter to a list of non-empty Strings?

我有一个 属性 接受字符串列表:

myProp :: [String] -> Bool

我需要限制 QuickCheck 生成的输入,以便列表中只有非空字符串。

我该怎么做?

您使用 forAll together with listOf (which generates lists) and listOf1(生成非空列表)。

例子

quickCheck $ forAll (listOf $ listOf1 arbitrary) $ myProp
-- more verbose alternative to make things clear
nonEmptyString :: Gen String
nonEmptyString = listOf1 arbitrary

quickCheck $ forAll (listOf nonEmptyString) $ myProp

或者,从第一原则(无库函数):

quickCheck $ \ h t -> let {s :: String ; s = h : t } in length s > 0

此处s遍历所有非空值。

import Test.QuickCheck.Modifiers (NonEmptyList (..))

myProp :: [NonEmptyList Char] -> Bool
myProp xs0 =
  let xs = map getNonEmpty xs0
  in ...