当前位置:  开发笔记 > 编程语言 > 正文

如何在Haskell中融合两个相同类型的枚举?

如何解决《如何在Haskell中融合两个相同类型的枚举?》经验,为你挑选了1个好方法。

我对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,并且++就像上面。



1> chepner..:

您需要在非空手之一上进行图案匹配,以便可以访问其中的卡。

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

严格来讲,您不需要h <+ Empty = h,因为一旦到达,第三条规则就可以重建手Empty <+ h。但是第二条规则节省了一些计算。

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

newtype Hand = Hand [Card]

然后

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

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有