【问题标题】:How can I fuse two enums of the same type in Haskell?如何在 Haskell 中融合两个相同类型的枚举?
【发布时间】:2019-11-19 17:39:02
【问题描述】:

我对 Haskell 还是很陌生,我很好奇如何将两个 Hand 合并在一起,以便将第一只手放在第二只手之上。我希望它是一个中缀运算符,即 (

data Rank = Numeric Integer | Jack | Queen | King | Ace
            deriving (Eq, Show)

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

data Card = Card Rank Suit
            deriving (Eq, Show)

data Hand = Empty | Add Card Hand
            deriving (Eq, Show)

(<+) :: Hand -> Hand -> Hand
(<+) Empty Empty = Empty
(<+) h Empty     = h
(<+) Empty h     = h
(<+) h1 h2       = h1 ++ h2

到目前为止,我已经尝试过mergeappendmappend++,如上所示。

【问题讨论】:

  • 你试过什么?你在哪里卡住了?
  • @JosephSible 抱歉,这实际上是我之前问过的问题,类似,但不一样。
  • @MichaelLitchard 更新
  • @JosephSible 我可以保证这是 Alex 想要问的问题,因为我是让他发布新问题的人。

标签: haskell enums haskell-platform


【解决方案1】:

您需要在其中一只非空手上进行模式匹配,以便您可以访问其中的卡片。

(<+) :: Hand -> Hand -> Hand
Empty <+ h = h
h <+ Empty = h
(Add c rest1) <+ h = Add c (rest1 <+ h)

严格来说,你不需要h &lt;+ Empty = h,因为一旦你到达Empty &lt;+ h,第三条规则就可以重建手牌。但第二条规则节省了一些计算量。

您不能使用++ 等。因为它们都没有为Hand 定义。但是,正如您在上一个问题的评论中指出的那样,Hand 所做的只是重新实现内置列表类型。您可以通过定义新类型来利用这一点。

newtype Hand = Hand [Card]

然后

(<+) :: Hand -> Hand -> Hand
(Hand h1) <+ (Hand h2) = Hand (h1 ++ h2)

【讨论】:

    猜你喜欢
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    相关资源
    最近更新 更多