我需要在我的Haskell程序上创建一个任意的实例,我正在创建一副牌(它是deck类型),而deck是一个卡列表,为了创建一个新的牌组程序使用mkStdGen和一个提示种子的数字,以便随机化新的牌组。
这个套牌需要有一个任意的实例来传递QuickTest属性测试。
这是一些代码
data Carta = C (Valor,Naipe) deriving (Eq,Ord)
instance Show Carta where
show (C (v,n)) =show v ++ show n
data Baralho = B [Carta]
instance Show Baralho where
show (B []) = ""
show (B [c]) = show c
show (B (c:cs)) = show c ++ "," ++ show (B cs)
type Mao = [Carta]
baralho40 :: Baralho
baralho40 = B [C (x,y)|y<-[Paus .. Espadas],x<-[As .. Rei]]
baralhar :: StdGen -> Baralho -> Baralho
baralhar g (B baralho) = B $ map snd $ sort $ zip (randomRs (1,(length baralho)^3) g) baralho
Carta
的一个非常基本的例子可能是:
instance Arbitrary Carta where
arbitrary = Carta <$> vn
where
vn = (,) <$> v <*> n
v = elements [Paus .. Espadas]
n = elements [As .. Rei]
来自模块elements
的Test.QuickCheck
函数获取值列表并返回这些值的生成器(即,随机选择其中一个值的东西):
elements :: [a] -> Gen a
上面的实例使用它来独立生成随机Valor
和随机Naipe
卡。然后将那些值组合成一个元组(vn
是元组的生成器,类型为Gen (Valor,Naipe)
)。之后将其包装到Carta
本身的生成器中。
要生成随机牌组(您不希望有重复牌),请查看该功能:
shuffle :: [a] -> Gen [a]
在Test.QuickCheck
。它生成项目列表的随机排列。制作Carta
的Valor
,Naipe
和Enum
元素也会有所帮助。