一些Haskell代码中的程序流程

Hak*_*ley 0 haskell

我有一个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)

Car*_*ten 5

最后一个是通常的递归情况:

如果你的左手手由一个卡card 加上一些尾手 hand1,那么你可以串连的权利h2加入(命名似乎很奇怪)card前面你当您在串联 hand1h2(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(或者我猜)

  • PS: what is**real**logic? (3认同)