在 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/