【发布时间】:2018-08-26 04:15:22
【问题描述】:
这行得通:
genAnimal :: Gen String
genAnimal = do
animals <- shuffle ["tiger","rabbit","dragon","snake","rat","ox","pig","sheep","horse","monkey","dog"]
return (head animals)
genWinner :: Gen String
genWinner = do
animal <- genAnimal
prize <- choose (10::Int,1000::Int)
return (unwords (replicate 3 animal) ++ " " ++ show prize)
genTicket :: Gen String
genTicket = do
animals <- replicateM 3 genAnimal
prize <- choose (10::Int,1000::Int)
return (unwords animals ++ " " ++ show prize)
genTickets :: Gen [String]
genTickets = do
tickets <- replicateM 6 (oneof [genWinner, genTicket])
return tickets
但它看起来很笨拙,有没有更明智的方法来组合这些生成器?它基本上随机挑选三只动物,然后随机抽取一个奖品,然后制作六张门票。
【问题讨论】:
-
我觉得很奇怪票是
String。拥有(静态)类型系统的想法是它保证某些合同。通过引入Ticket数据类型,您可以约定结果是Ticket,而不仅仅是随机 字符串。 -
我不清楚这些生成器应该做什么。 AFAICT、
genWinner和genTicket具有相同的行为。你能详细说明一下目标吗? -
genWinner 生成三个相同的动物,genTicket 随机选择三个可能相同或不同的动物。
标签: haskell quickcheck