Haskell 数据类型和任意,是否将它们添加到一起?

Haskell 数据类型和任意,是否将它们添加到一起?,haskell,Haskell,首先这是作业,所以请不要给太多!我需要理解这一点,而不是复制别人的代码 我必须制作一副牌。我已经得到了可以使用的代码,但我就是不能让它们工作。我的意思是,我可以在2012-2013年的展会上创造出最好的一副牌,但这对我一点帮助都没有,因为我需要使用我们提供的代码,我不允许更改它 (我使用Read和Enum创建了一副卡片,这张看起来非常漂亮,但我无法完成此任务) 我得到了一些错误消息在最后,你可以看到 import Test.QuickCheck --DECK OF CARDS

首先这是作业,所以请不要给太多!我需要理解这一点,而不是复制别人的代码

我必须制作一副牌。我已经得到了可以使用的代码,但我就是不能让它们工作。我的意思是,我可以在2012-2013年的展会上创造出最好的一副牌,但这对我一点帮助都没有,因为我需要使用我们提供的代码,我不允许更改它

(我使用Read和Enum创建了一副卡片,这张看起来非常漂亮,但我无法完成此任务)

我得到了一些错误消息在最后,你可以看到

   import Test.QuickCheck

    --DECK OF CARDS

    data Suit = Hearts | Spades | Diamonds | Clubs
       deriving (Eq, Show)

    data Card = Card Rank Suit
        deriving (Eq, Show)

    data Rank = Numeric Integer | Jack | Queen | King | Ace
        deriving (Eq, Show)

    instance Arbitrary Rank where
    arbitrary = frequency [ (1, return Jack)
                    , (1, return Queen)
                    , (1, return King)
                    , (1, return Ace)
                    , (9, do n <- choose (2, 10)
                             return (Numeric n))

                    ]

     --MY OWN CODE

     type Deck = [Card]
     deck :: Deck
     deck = [Card v s | v <- arbitrary Rank, s <- Suit]
我哪里做错了?我错过了一些基本的东西吗?如果是的话,我在哪里读到它


我将感谢所有的建议和想法

我想指出您的代码中的几个问题:

  • arbitral
    的类型是
    arbitral::arbitral a=>Gen a
    。所以你需要一些东西来运行这个生成器来获取随机列表

  • Rank
    Suit
    是类型而不是值。您还需要显式地将类型指定给
    arbitral
    ,以获得该类型的生成器。像
    任意::(genrank)
    然后运行 类似于
    sample'
    或其他函数来实际获取随机列组

  • 同样,您需要为
    套装
    套牌
    定义任意的实例。然后,您只需将
    arbitral
    键入
    Gen-Deck
    即可生成
    Deck

  • 更多的是一个逻辑缺陷。您的任意实例不能保证约束,比如一副牌中应该正好有4个国王等。因此,在为
    Deck
    定义任意实例时,您应该注意这一点

  • 定义
    任意
    实例时,请参考
    测试中的函数类型。快速检查
    。通过查看类型,您将获得大部分正确信息


看起来你确实有一个基本的误解:在你的列表理解中,你试图使用
Rank
Suit
类似于列表,但它们不是——它们是类型名称。如果你想反复浏览一系列西装,你需要自己制作一套


在表达式中,大写标识符应该是数据构造函数(因为类型在该上下文中没有任何意义)。编译器错误在这里并不是特别有用——它在数据构造函数名称空间中查找
Rank
Suit
,但没有找到它们。

除了其他注释外,您应该注意,选择52张随机卡是不起作用的。首先你需要创建一个包含所有牌的牌组,然后你需要洗牌。你可以在谷歌上搜索“haskell shuffle”,也可以查找“Fisher Yates”或“Knuth shuffle”(它们都是一样的)。当心奥列格写的帖子:你还不能理解它们。“克努斯洗牌”听起来像是一种有趣的舞蹈风格-D
   Prelude> :l test4
   [1 of 1] Compiling Main             ( test4.hs, interpreted )

   test4.hs:31:35: Not in scope: data constructor `Rank'

   test4.hs:31:46: Not in scope: data constructor `Suit'
   Failed, modules loaded: none.