Haskell使用QuickCheck定义Rank类型Arbitrary实例时构造子不在作用域
错误原因
你的编译报错来源于Arbitrary Rank实例的arbitrary定义逻辑错误:
Numeric是Rank类型的带参构造子,需要接收一个Int类型的具体值(比如2、10这种合法的扑克牌点数)作为参数- 你代码中写的
Numeric Int是把Int这个类型名当成了值传入,编译器自然找不到名为Int的Int类型值,因此抛出Data constructor not in scope: Int :: Int错误
正确实现方案
你需要组合两种随机生成逻辑,分别覆盖数字牌面和非数字牌面:
instance Arbitrary Rank where arbitrary = oneof [ Numeric <$> choose (2, 10) -- 生成2~10范围内的随机整数,包装为Numeric类型 , elements [Jack, Queen, King, Ace] -- 等概率选择四个固定非数字牌面 ]
如果需要让各牌面的生成概率和真实扑克牌一致(9种数字牌+4种非数字牌,总13种牌面概率均等),可以改用frequency定义:
instance Arbitrary Rank where arbitrary = frequency [ (9, Numeric <$> choose (2, 10)) , (1, pure Jack) , (1, pure Queen) , (1, pure King) , (1, pure Ace) ]
内容的提问来源于stack exchange,提问作者harleengulati03
相关产品推荐
相关产品推荐

