我对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
到目前为止,我已经试过merge
,append
,mappend
,并且++
就像上面。
您需要在非空手之一上进行图案匹配,以便可以访问其中的卡。
(<+) :: 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)