任意Haskell的实例

时间:2017-12-19 23:37:12

标签: haskell quickcheck

我需要在我的Haskell程序上创建一个任意的实例,我创建了一副牌(它是甲板类型),而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

1 个答案:

答案 0 :(得分:1)

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的{​​{1}},ValorNaipe元素也很有帮助。