我有一个haskell函数,不知何故与中缀运算符有关。
(<+) :: Hand -> Hand -> Hand
Empty <+ hand = hand
hand <+ Empty = hand
(Add card hand1) <+ h2 = Add card (hand1 <+ h2)
函数签名后的前两行非常容易理解,但最后一行对我来说有点难以理解它是如何流动的
该功能的目的是创建一个操作员,当给予双手时,它将一只手添加到另一只手上。通过&#34; Hand&#34;我可以指一组卡片。
卡片和手牌类型的定义如下
data Card = Card { rank :: Rank, suit :: Suit } deriving (Eq, Show)
data Hand = Empty | Add Card Hand deriving (Eq, Show)
答案 0 :(得分:5)
最后一个是通常的递归案例:
如果您的左手牌包含一张卡card
加某些尾巴 hand1
,那么您可以通过在连接时获得的内容之前添加h2
连接右手card
(命名似乎很奇怪) hand1
和h2
(recursivley) - 这正是hand1 <+ h2
重要的是左手越来越小,所以递归最终会停止 - 你只需将(<+)
推到那里(通过拉出Add
)直到你到了Empty
个案例之一。
也许一个例子有帮助:
(Add l1 (Add l2 Empty)) <+ (Add r1 Empty)
{ last case }
= Add l1 ((Add l2 Empty) <+ (Add r1 Empyt))
{ last case for the inner part }
= Add l1 (Add l2 (Empty <+ (Add r1 Empty)))
{ first case inner }
= Add l1 (Add l2 (Add r1 Empty))
这只是l1,l2,r1
的一只手(或者我猜)