You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 18:03:03