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

时间:2012-09-13 18:04:46

标签: haskell

首先是作业,所以请不要放弃太多!我需要了解这一点,而不是复制别人的代码。 :)

我必须创建一副牌...去图;)我已经给了代码使用,我只是不能让他们工作...我的意思是我可以创建最好的卡片组2012年-2013但这对我没有任何帮助,因为我需要使用我们给出的代码而且我不能改变它。

(我使用Read和Enum来创建一副牌,那一张看起来很棒,但我不能用于这个分配:D)

我到底能看到一些错误信息。

   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]

当我尝试加载它时,我得到:

   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.

我哪里错了?我错过了什么基本的东西?如果是这样我在哪里阅读它?

我会很高兴所有的建议和想法!!

//此致

2 个答案:

答案 0 :(得分:3)

我会指出你的代码有几个问题:

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

  • RankSuit是类型,而不是某些值。此外,您需要明确地为arbitrary提供类型以获取该类型的生成器。比如arbitrary :: (Gen Rank)然后运行 像sample'或其他一些函数来实际获得随机排名。

  • 同样,您需要为CardSuitDeck定义任意实例。然后,只需将Deck强制转换为arbitrary

  • ,即可生成Gen Deck
  • 更多的逻辑缺陷。你的任意实例不会保证约束,就像甲板上应该有4个国王等。因此,在为Deck定义任意实例时,您应该注意这一点。

  • 在定义Test.QuickCheck个实例时,请参阅arbitrary中的函数类型。只需查看类型,您就可以获得大部分功能。

答案 1 :(得分:2)

看起来你确实有一个基本的误解:在你的列表理解中,你试图使用RankSuit之类的列表,但它们不是 - 它们是类型名称。如果你想迭代一套西装,你需要自己制作一套。

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