首先是作业,所以请不要放弃太多!我需要了解这一点,而不是复制别人的代码。 :)
我必须创建一副牌...去图;)我已经给了代码使用,我只是不能让他们工作...我的意思是我可以创建最好的卡片组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.
我哪里错了?我错过了什么基本的东西?如果是这样我在哪里阅读它?
我会很高兴所有的建议和想法!!
//此致
答案 0 :(得分:3)
我会指出你的代码有几个问题:
arbitrary
的类型为arbitrary :: Arbitrary a => Gen a
。所以你需要一些东西来运行这个生成器来获取随机列表。
Rank
和Suit
是类型,而不是某些值。此外,您需要明确地为arbitrary
提供类型以获取该类型的生成器。比如arbitrary :: (Gen Rank)
然后运行
像sample'
或其他一些函数来实际获得随机排名。
同样,您需要为Card
,Suit
和Deck
定义任意实例。然后,只需将Deck
强制转换为arbitrary
Gen Deck
更多的逻辑缺陷。你的任意实例不会保证约束,就像甲板上应该有4个国王等。因此,在为Deck
定义任意实例时,您应该注意这一点。
在定义Test.QuickCheck
个实例时,请参阅arbitrary
中的函数类型。只需查看类型,您就可以获得大部分功能。
答案 1 :(得分:2)
看起来你确实有一个基本的误解:在你的列表理解中,你试图使用Rank
和Suit
之类的列表,但它们不是 - 它们是类型名称。如果你想迭代一套西装,你需要自己制作一套。
在表达式中,大写的标识符应该是一个数据构造函数(因为类型在该上下文中没有任何意义)。编译器错误在这里不是特别有用 - 它在数据构造函数命名空间中查找Rank
和Suit
,而不是找到它们。