我有一个haskell函数,以某种方式与中缀运算符相关.
(<+) :: Hand -> Hand -> Hand
Empty <+ hand = hand
hand <+ Empty = hand
(Add card hand1) <+ h2 = Add card (hand1 <+ h2)
Run Code Online (Sandbox Code Playgroud)
函数签名后的前两行是可以理解的,但最后一行对我来说有点难以理解它是如何流动的
该功能的目的是创建一个操作员,当给予双手时,它将一只手添加到另一只手上.通过"手",我可以指一组卡片.
卡和手类型的定义如下
data Card = Card { rank :: Rank, suit :: Suit } deriving (Eq, Show)
data Hand = Empty | Add Card Hand deriving (Eq, Show)
Run Code Online (Sandbox Code Playgroud)
最后一个是通常的递归情况:
如果你的左手手由一个卡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))
Run Code Online (Sandbox Code Playgroud)
这只是一只手l1,l2,r1
(或者我猜)