gpt4 book ai didi

haskell - 数据类型和任意,将它们加在一起?

转载 作者:行者123 更新时间:2023-12-02 21:27:57 24 4
gpt4 key购买 nike

首先是家庭作业,所以请不要放弃太多!我需要理解这一点,而不是复制别人的代码。

我必须创建一副纸牌。我已经获得了可以使用的代码,但我就是无法让它们工作。我的意思是我可以创建 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.

我哪里出错了?我错过了一些基本的东西吗?如果是这样,我在哪里阅读它?

我将感谢任何和所有的建议和想法!

最佳答案

我会指出您的代码的几个问题:

  • 任意的类型为任意::Arbitrary a => Gen a。所以你需要一些东西来运行这个生成器来获取随机列表。

  • RankSuit 是类型而不是某些值。此外,您还需要显式地将类型指定给任意类型以获取该类型的生成器。像 任意::(Gen Rank) 然后运行像 sample' 或其他一些函数来实际获取随机排名。

  • 同样,您需要为 CardSuitDeck 定义任意实例。然后,您只需将 任意 类型转换为 Gen Deck 即可生成 Deck

  • 更多的是逻辑缺陷。你的任意实例不能保证像一副牌中应该有 4 个 K 等约束。因此,在为 Deck 定义任意实例时,您应该注意这一点。

  • 定义任意实例时引用Test.QuickCheck中的函数类型。只需查看类型即可正确完成大部分操作。

关于haskell - 数据类型和任意,将它们加在一起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12412198/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com