gpt4 book ai didi

Haskell:如何生成两种简单代数数据类型的笛卡尔积

转载 作者:行者123 更新时间:2023-12-04 16:26:15 24 4
gpt4 key购买 nike

我正在学习 Haskell,所以我正在编写一些简单的纸牌游戏。我定义了一些数据类型:

data Rank = Ace|Two|Three|Four|Five|Six|Seven|Eight|Nine|Ten|Jack|Queen|King deriving (Eq,Show,Ord)

data Suit = Hearts|Spades|Diamonds|Clubs deriving (Show)

data Card = Card Rank Suit

现在我想创建一个包含 52 张卡片的原始套牌。我敢肯定有一种巧妙的方法可以做到这一点,但我能想到的只是:
 pristineDeck = [Card Ace Hearts, Card Two Hearts, ...]

我可以让 Haskell 为我生成这个列表吗?

最佳答案

列表推导是一个非常整洁的语法。如果推导出 EnumRankSuit你可以很简单地表达为:

pristineDeck = [ Card rank suit | suit <- [Hearts .. Clubs], rank <- [Ace .. King] ]

如果你想知道为什么我有 suitrank在不同的顺序中,第一个是因为 Card 的顺序构造函数使用,而后者是获取结果列表的顺序——以升序排列。

更一般地说,或者当单个列表理解变得过于庞大时,笛卡尔积正是 Monad 给出的行为。列表的例子。以下等价于上面的列表推导:
pristineDeck = do suit <- [Hearts .. Clubs]
rank <- [Ace .. King]
return $ Card rank suit

作为另一个小问题,为了省去记住 Suit 的顺序的麻烦。值在,派生 Bounded也可以写 [minBound .. maxBound]Enum 的实例枚举任何类型的所有值和 Bounded .

关于Haskell:如何生成两种简单代数数据类型的笛卡尔积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14166816/

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