任意实例 Haskell

Instance of Arbitrary Haskell

我需要在我的 Haskell 程序中创建一个 arbitrary 的实例,我正在创建一副纸牌(属于 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]

模块 Test.QuickCheck 中的 elements 函数接受一个值列表和 returns 这些值的生成器(即 select 随机生成这些值之一):

elements :: [a] -> Gen a

上面的实例使用它为卡片独立生成随机 Valor 和随机 Naipe。然后将这些值组合成一个元组(vn 是元组的生成器,类型 Gen (Valor,Naipe))。之后将其包装到 Carta 本身的生成器中。

要生成一副随机的纸牌(您不希望有重复的纸牌),请查看函数:

shuffle :: [a] -> Gen [a]

Test.QuickCheck 中。它生成项目列表的随机排列。制作 Enum.

CartaValorNaipe 元素也很有帮助