Haskell 使用快速检查生成随机字符串日期

Haskell 使用快速检查生成随机字符串日期,haskell,quickcheck,Haskell,Quickcheck,我需要生成一个由空格分隔的名称字符串,其中名称只是一个随机长度的字符,日期只是四个数字。例如: “dfghjkl-1234 derftgyhjuik-5678” 目前我有以下解决方案: genArgs :: Gen String genArgs = do cs <- listOf1 genCourse return (unwords cs) genCourse :: Gen String genCourse = do ns <- elements ["1111","12

我需要生成一个由空格分隔的名称字符串,其中名称只是一个随机长度的字符,日期只是四个数字。例如:

“dfghjkl-1234 derftgyhjuik-5678”

目前我有以下解决方案:

genArgs :: Gen String
genArgs = do
  cs <- listOf1 genCourse
  return (unwords cs)

genCourse :: Gen String
genCourse = do
  ns <- elements ["1111","1234","4567","1411","1284","4517"]
  ls <- listOf1 $ elements ['a'..'z']
  return (ls ++ "-" ++ ns)
genArgs::Gen字符串
genArgs=do

cs这里有一个尝试。您可以从定义四位数字“日期”的生成器开始:

genDate :: Gen String
genDate = vectorOf 4 $ elements ['0'..'9']
接下来,一个函数,给定一个
字符串
将返回一个“courses”生成器:

genCourse :: String -> Gen String
genCourse ns = do
  ls <- listOf1 $ elements ['a'..'z']
  return (ls ++ "-" ++ ns)
四分之一的值将由常量生成器生成
返回日期
,四分之三的值将由
genDate
随机生成

这将生成一个“日期”字符串列表,然后您可以使用
genCourse
遍历这些字符串

以下是一些示例值:

*Main Lib> sample genArgs
"u-8747"
"sd-2575 l-3069"
"rfn-1191 jbs-8962 kjtt-1909"
"ezbtrj-6167 t-3474 daaht-0834 puc-2266"
"epkbtz-8334 uj-8829 etu-9061 wkkro-5514 fque-4639 vgct-4572 daczohr-8683 zomo-5789"
"mkrnvyrjfu-6765 vunu-6869 xjd-1135 rkritwi-6869 odmvxec-4236 mirrfp-1715 jccla-0998 qyasxozuq-3713"
"cvyxjnvrqao-3675 rzsnkqplbv-3675 b-3675 ekchdgksbk-6463 nonz-3354 ue-3675 mwwoovthxusd-8882"
"vwffdntpwawo-4565"
"t-0278 dyauqxenubxjohr-7815 yvogox-5183 oz-4660 eufwzgabvo-3813 azetihbmuw-8622 tizuzbmacv-6102 tzqjz-9686 jsaaepngbi-7394 fzzpzykibohzf-7394 muhlolo-6770 tixpoi-7394 kqhvvw-5877 ulg-7394 ce-6817"
"y-3550 tfakitqwrhyrpu-6923 gwzpegkpxjn-7222 jkvuwsf-2819 il-2268 sfmxdh-0004 vqmalaisvtqtg-1759 acxn-3146 fuhwps-4534 rtqgqzndtjhiygan-3326 yktgeeww-2819 irtrpnh-0198 ghqs-2819 lofyzpejuzw-8408 hd-2647"
"kts-8877 kipbbttkzvopwkrmemsz-2158 xqblwsgdrhaupbfgg-0841 eminvqkvwl-9193 bjhzmafgnjyhdzuppar-9912 cg-7737 enjvjalpkstizymci-0039"

请注意,例如,
6869
在第六个值中重复了两次,
3675
在第七个样本中重复了四次。

您是否仍然生成随机元素,但也创建一个新的
集合
类型,并生成具有正确分布的值的
集合
s?这似乎与此相关。我希望当你能够以足够的精度说出你所说的“生成一个随机的4位数字,然后该字符串的某些元素应该有25%的时间重复”时,你也能够自己写下代码。
*Main Lib> sample genArgs
"u-8747"
"sd-2575 l-3069"
"rfn-1191 jbs-8962 kjtt-1909"
"ezbtrj-6167 t-3474 daaht-0834 puc-2266"
"epkbtz-8334 uj-8829 etu-9061 wkkro-5514 fque-4639 vgct-4572 daczohr-8683 zomo-5789"
"mkrnvyrjfu-6765 vunu-6869 xjd-1135 rkritwi-6869 odmvxec-4236 mirrfp-1715 jccla-0998 qyasxozuq-3713"
"cvyxjnvrqao-3675 rzsnkqplbv-3675 b-3675 ekchdgksbk-6463 nonz-3354 ue-3675 mwwoovthxusd-8882"
"vwffdntpwawo-4565"
"t-0278 dyauqxenubxjohr-7815 yvogox-5183 oz-4660 eufwzgabvo-3813 azetihbmuw-8622 tizuzbmacv-6102 tzqjz-9686 jsaaepngbi-7394 fzzpzykibohzf-7394 muhlolo-6770 tixpoi-7394 kqhvvw-5877 ulg-7394 ce-6817"
"y-3550 tfakitqwrhyrpu-6923 gwzpegkpxjn-7222 jkvuwsf-2819 il-2268 sfmxdh-0004 vqmalaisvtqtg-1759 acxn-3146 fuhwps-4534 rtqgqzndtjhiygan-3326 yktgeeww-2819 irtrpnh-0198 ghqs-2819 lofyzpejuzw-8408 hd-2647"
"kts-8877 kipbbttkzvopwkrmemsz-2158 xqblwsgdrhaupbfgg-0841 eminvqkvwl-9193 bjhzmafgnjyhdzuppar-9912 cg-7737 enjvjalpkstizymci-0039"