【问题标题】:Instance of Arbitrary Haskell任意 Haskell 实例
【发布时间】:2017-12-19 23:37:11
【问题描述】:

我需要在我的 Haskell 程序中创建一个任意的实例,我正在创建一副纸牌(它是纸牌类型),而纸牌是纸牌列表,以便制作程序使用的新纸牌一个 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

【问题讨论】:

  • 不错的一副牌...你有什么问题?
  • @WillemVanOnsem 我需要将其实例化为任意以便能够使用 Test.QuickCheck,但我不知道该怎么做

标签: haskell quickcheck


【解决方案1】:

Carta 的一个非常基本的实例可能是:

instance Arbitrary Carta where
  arbitrary = Carta <$> vn
    where
      vn = (,) <$> v <*> n
      v  = elements [Paus .. Espadas]
      n  = elements [As .. Rei]

来自模块Test.QuickCheckelements 函数接受一个值列表并返回这些值的生成器(即随机选择其中一个值的东西):

elements :: [a] -> Gen a

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

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

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

Test.QuickCheck。它生成项目列表的随机排列。制作EnumCartaValorNaipe 元素也会很有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 2011-09-11
    • 2011-01-05
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多