Haskell 数据类型和任意,是否将它们添加到一起?
首先这是作业,所以请不要给太多!我需要理解这一点,而不是复制别人的代码 我必须制作一副牌。我已经得到了可以使用的代码,但我就是不能让它们工作。我的意思是,我可以在2012-2013年的展会上创造出最好的一副牌,但这对我一点帮助都没有,因为我需要使用我们提供的代码,我不允许更改它 (我使用Read和Enum创建了一副卡片,这张看起来非常漂亮,但我无法完成此任务) 我得到了一些错误消息在最后,你可以看到Haskell 数据类型和任意,是否将它们添加到一起?,haskell,Haskell,首先这是作业,所以请不要给太多!我需要理解这一点,而不是复制别人的代码 我必须制作一副牌。我已经得到了可以使用的代码,但我就是不能让它们工作。我的意思是,我可以在2012-2013年的展会上创造出最好的一副牌,但这对我一点帮助都没有,因为我需要使用我们提供的代码,我不允许更改它 (我使用Read和Enum创建了一副卡片,这张看起来非常漂亮,但我无法完成此任务) 我得到了一些错误消息在最后,你可以看到 import Test.QuickCheck --DECK OF CARDS
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]
我哪里做错了?我错过了一些基本的东西吗?如果是的话,我在哪里读到它
我将感谢所有的建议和想法 我想指出您的代码中的几个问题:
的类型是arbitral
。所以你需要一些东西来运行这个生成器来获取随机列表arbitral::arbitral a=>Gen a
和Rank
是类型而不是值。您还需要显式地将类型指定给Suit
,以获得该类型的生成器。像arbitral
然后运行 类似于任意::(genrank)
或其他函数来实际获取随机列组sample'
- 同样,您需要为
、卡
和套装
定义任意的实例。然后,您只需将套牌
键入arbitral
即可生成Gen-Deck
Deck
- 更多的是一个逻辑缺陷。您的任意实例不能保证约束,比如一副牌中应该正好有4个国王等。因此,在为
定义任意实例时,您应该注意这一点Deck
- 定义
实例时,请参考任意
。通过查看类型,您将获得大部分正确信息测试中的函数类型。快速检查
Rank
和Suit
类似于列表,但它们不是——它们是类型名称。如果你想反复浏览一系列西装,你需要自己制作一套
在表达式中,大写标识符应该是数据构造函数(因为类型在该上下文中没有任何意义)。编译器错误在这里并不是特别有用——它在数据构造函数名称空间中查找
Rank
和Suit
,但没有找到它们。除了其他注释外,您应该注意,选择52张随机卡是不起作用的。首先你需要创建一个包含所有牌的牌组,然后你需要洗牌。你可以在谷歌上搜索“haskell shuffle”,也可以查找“Fisher Yates”或“Knuth shuffle”(它们都是一样的)。当心奥列格写的帖子:你还不能理解它们。“克努斯洗牌”听起来像是一种有趣的舞蹈风格-D
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.