首页 > 解决方案 > 如何从每个可能的字符中生成字符串?

问题描述

目前我正在生成这样的字符串:

arbStr :: Gen String
arbStr = listOf $ elements (alpha ++ digits)
  where alpha = ['a'..'z']
        digits = ['0'..'9']

但显然这只会从 alpha num 字符生成字符串。我怎样才能从所有可能的字符中生成它?

标签: haskellgeneratorquickcheck

解决方案


Char是 theEnumBoundedtypeclass 的实例,您可以使用该arbitraryBoundedEnum :: (Bounded a, Enum a) => Gen a函数:

import Test.QuickCheck(Gen, arbitraryBoundedEnum, listOf)

arbStr :: Gen String
arbStr = listOf arbitraryBoundedEnum

例如:

Prelude Test.QuickCheck> sample arbStr
""
""
"\821749"
"\433465\930384\375110\256215\894544"
"\431263\866378\313505\1069229\238290\882442"
""
"\126116\518750\861881\340014\42369\89768\1017349\590547\331782\974313\582098"
"\426281"
"\799929\592960\724287\1032975\364929\721969\560296\994687\762805\1070924\537634\492995\1079045\1079821"
"\496024\32639\969438\322614\332989\512797\447233\655608\278184\590725\102710\925060\74864\854859\312624\1087010\12444\251595"
"\682370\1089979\391815"

或者您可以arbitrary在类型类中使用Arbitrary Char

import Test.QuickCheck(Gen, arbitrary, listOf)

arbStr :: Gen String
arbStr = listOf arbitrary

请注意,arbitraryforChar的实现使得 ASCII 字符比非 ASCII 字符更常见(三倍),因此“分布”不同。


推荐阅读