2017-12-19 22 views
-3

私はHaskellプログラムで任意のインスタンスを作成する必要があります。私は(デッキタイプの)デッキを作成しています。デッキはカードのリストです。デッキプログラムは、新しいデッキをランダム化するために、mkStdGenと数字を使用してシードを促します。任意のインスタンスHaskell

このデッキでは、QuickTestプロパティテストに合格するために、任意のインスタンスが必要です。

ここではいくつかのコード

data Carta = C (Valor,Naipe) deriving (Eq,Ord) 

instance Show Carta where 
show (C (v,n)) =show v ++ show n 

data Baralho = B [Carta] 

    instance Show Baralho where 
    show (B []) = "" 
    show (B [c]) = show c 
    show (B (c:cs)) = show C++ "," ++ show (B cs) 

    type Mao = [Carta] 

    baralho40 :: Baralho 

    baralho40 = B [C (x,y)|y<-[Paus .. Espadas],x<-[As .. Rei]] 

    baralhar :: StdGen -> Baralho -> Baralho 

    baralhar g (B baralho) = B $ map snd $ sort $ zip (randomRs (1,(length  baralho)^3) g) baralho 
+1

カードの素敵なデッキ...あなたの質問は何ですか? –

+0

@WillemVanOnsem私はTest.QuickCheckを使用できるようにするために任意のインスタンスにする必要がありますが、私はそれを行う方法がわかりません –

答えて

1

Cartaのための非常に基本的なインスタンスは可能性があります:

instance Arbitrary Carta where 
    arbitrary = Carta <$> vn 
    where 
     vn = (,) <$> v <*> n 
     v = elements [Paus .. Espadas] 
     n = elements [As .. Rei] 

値のリストを受け取り、それらの値のための発電機を返しTest.QuickCheckモジュールからelements機能(すなわちこれらの値の1つをランダムに選択するもの):

elements :: [a] -> Gen a 

上記の例では、これを使用してカードにランダムにValorとランダムNaipeを生成しています。これらの値をタプルに結合します(vnはタプルのジェネレータ)。タイプはGen (Valor,Naipe)です。その後、これをCarta用の発電機にラップします。 Test.QuickCheck

shuffle :: [a] -> Gen [a] 

は、機能を見て、(あなたが重複を持っている必要はありません)カードのランダムなデッキを生成するには。アイテムリストのランダムな順列を生成します。 Carta, ValorNaipeの要素を Enumにすると便利です。

関連する問題