haskell - 如何在 QuickCheck 中生成特定的随机字符串?

标签 haskell quickcheck

在 Haskell 的 QuickCheck 中,如何生成一个字符串,使其只包含字符“S”和“C”,并且“S”和“C”的位置是随机的?

例如:“SCCS”、“SSSS”、“CCCC”、“CSSCCS”、“”

我的用例是这样的:

我有两个功能 countCAndS :: String -> (Int, Int)countCAndS' :: String -> (Int, Int) .它们具有相同的类型签名。我想编写一个 QuickCheck 属性,以便我可以将相同的字符串传递给这两个不同的函数并检查输出是否相同。

最佳答案

让您的属性获取 bool 值列表并将它们转换为 cs 和 ss。

prop_CountersEqual :: [Bool] -> Bool
prop_CountersEqual bs = countCAndS css == countCAndS' css where
    css = map (\b -> if b then 'C' else 'S') bs

如果你经常需要这个,你可能想用合适的 Arbitrary 定义一个新类型。实例。
newtype CAndS = CAndS String
instance Arbitrary CAndS where
    arbitrary = CAndS . map (\b -> if b then 'C' else 'S') <$> arbitrary

然后你可以写你的属性,例如
prop_CountersEqual' :: CAndS -> Bool
prop_CountersEqual' (CAndS css) = countCAndS css == countCAndS' css

关于haskell - 如何在 QuickCheck 中生成特定的随机字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49738163/

相关文章:

http - 获取请求时出现 Elm NetworkError,但控制台表示没问题

haskell - 有没有更好的方法使用有理数来实现斐波那契公式?

haskell - 使用 Quickcheck 测试类型类,可变数量的参数

haskell - quickCheck 命题逻辑生成器

haskell - 编写简单的 QuickCheck URL 生成器时嵌套 monad 的问题

haskell - 将单元测试与 Haskell's Cabal 集成的当前状态?

opengl - "unknown GLU entry gluOrtho2D"在 Haskell 中使用 opengl

haskell - 了解 Haskell 的 `toUpper`

java - 是否可以用 Java 实现 `Functor<T>`?