3

最初は宿題なので、あまりあげないでください!私はこれを理解し、他の誰かのコードをコピーしないようにする必要があります。

カードのデッキを作成する必要があります。そして、使用するコードを与えられましたが、それらを機能させることができません。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]

ロードしようとすると、次のようになります。

   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.

どこが間違っていますか?基本的な何かが欠けていますか?もしそうなら、どこでそれを読むのですか?

あらゆる提案やアイデアに感謝します!

4

2 に答える 2

3

あなたのコードにいくつかの問題があることを指摘します。

  • の型はarbitraryですarbitrary :: Arbitrary a => Gen a。したがって、このジェネレーターを実行してランダム リストを取得するには、何かが必要です。

  • RankおよびSuitは型であり、何らかの値ではありません。arbitraryまた、そのタイプのジェネレーターを取得するには、タイプを明示的に指定する必要があります。likearbitrary :: (Gen Rank)を実行してから、 likesample'やその他の関数を実行して、実際にランダムなランクを取得します。

  • Card同様に、 、Suitおよびの任意のインスタンスを定義する必要がありますDeckDeck次に、型キャストarbitraryするだけでを生成できますGen Deck

  • より論理的な欠陥。あなたの任意のインスタンスは、デッキに正確に 4 人のキングなどがあるべきであるなどの制約を保証しません。したがって、任意のインスタンスを定義している間は、Deckそれを処理する必要があります。

  • インスタンスTest.QuickCheckを定義する際に関数の型を参照してください。arbitraryタイプを見るだけで、ほとんどのことが正しく理解できます。

于 2012-09-13T18:23:15.330 に答える
2

基本的な誤解があるようです: リスト内包表記では、リストを使用RankしてSuit好きにしようとしていますが、そうではありません-それらは型名です。スーツのリストを反復処理する場合は、自分でスーツを作成する必要があります。

式では、大文字の識別子はデータ コンストラクターであることが期待されます (型はそのコンテキストでは意味をなさないため)。コンパイラ エラーは、ここでは特に役に立ちません。データ コンストラクターの名前空間を調べてRankSuitそれらを見つけられません。

于 2012-09-13T18:32:01.097 に答える