撰寫了下面的代碼,但遇到了一些問題:
我得到的錯誤是:資料建構式不在范圍內:Int :: Int
如果我從我的陣列中洗掉 Numeric Int 元素,則代碼作業得很好,但是 Numeric Int 是 Rank 型別的建構式,因此也應該包含它,但我不確定如何在不產生此錯誤的情況下包含它。
下面是代碼,如果這個問題冗長或愚蠢,我深表歉意,這是我在 StackOverflow 上的第一篇文章,所以任何關于如何問這個問題的反饋也將不勝感激。
任何幫助將不勝感激
import Test.QuickCheck
import Data.Data
import Data.Typeable
data Suit = Spades | Hearts | Clubs | Diamonds
deriving Show
data Colour = Black | Red
deriving Show
colour :: Suit -> Colour
colour Spades = Black
colour Hearts = Red
colour Diamonds = Red
colour Clubs = Black
data Rank = Numeric Int | Jack | Queen | King | Ace
deriving Show
rankBeats :: Rank -> Rank -> Bool
rankBeats _ Ace = False
rankBeats Ace _ = True
rankBeats _ King = False
rankBeats King _ = True
rankBeats _ Queen = False
rankBeats Queen _ = True
rankBeats _ Jack = False
rankBeats Jack _ = True
rankBeats (Numeric m) (Numeric n) = m > n
prop_rankBeats :: Rank -> Rank -> Bool
prop_rankBeats a b = rankBeats a b || rankBeats b a
instance Arbitrary Rank where
arbitrary = elements [Numeric Int,Jack, Queen, King, Ace]
uj5u.com熱心網友回復:
您Arbitrary的 a 實體Rank包含一個Int:
instance Arbitrary Rank where
-- an Int ↓
arbitrary = elements [Numeric Int, Jack, Queen, King, Ace]
但是 anInt不是資料建構式,而是型別建構式。你不能使用這個。
您可以做的是制作一個如下所示的生成器:
instance Arbitrary Rank where
arbitrary = oneof ((Numeric <$> arbitrary) : map pure [Jack, Queen, King, Ace])
這里的第一項Numeric <$> arbitrary將使用型別的Arbitrary實體Int,此外我們使用map pure [Jack, Queen, King, Ace]將這些Ranks 轉換為Gen Ranks。在oneof :: [Gen a] -> Gen a隨后每次都會從串列中挑選一個亂數發生器。oneof將挑選重量相同的物品。例如,我們可以使用frequency不同的權重來選擇這些:
{-# LANGUAGE TupleSections #-}
instance Arbitrary Rank where
arbitrary = frequency ((9, Numeric <$> chooseInt (2,10)) : map ((1,) . pure) [Jack, Queen, King, Ace])
這里更公平:13 次中有 9 次,它會選擇 a Numeric,我們使用chooseInt (2, 10)這樣的方式只Int在2和之間生成s 10。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/316820.html
上一篇:以三角形為中心(HASKELL)
下一篇:Haskell-給定串列,將其分解為彼此相鄰的相同專案的串列:[1,1,2,4,5,5]?[[1,1],[2],[4],[5,5]]]
