Sorting 解释一下';合并';Haskell函数
我正在学习Haskell,在理解这个函数时遇到了困难。我正在执行合并排序。我已经实现了mergesort递归函数,但我不明白这个“merge”函数在做什么。我理解命令式语言中的合并排序,但我不理解这里的语法Sorting 解释一下';合并';Haskell函数,sorting,haskell,mergesort,Sorting,Haskell,Mergesort,我正在学习Haskell,在理解这个函数时遇到了困难。我正在执行合并排序。我已经实现了mergesort递归函数,但我不明白这个“merge”函数在做什么。我理解命令式语言中的合并排序,但我不理解这里的语法 merge [] ys = ys merge xs [] = xs merge xs@(x:xt) ys@(y:yt) | x <= y = x : merge xt ys
merge [] ys = ys
merge xs [] = xs
merge xs@(x:xt) ys@(y:yt) | x <= y = x : merge xt ys
| otherwise = y : merge xs yt
merge[]ys=ys
合并xs[]=xs
合并xs@(x:xt)ys@(y:yt)|x
如果第一个参数为空,则给出第二个参数
merge xs [] = xs
merge xs@(x:xt) ys@(y:yt) | x <= y = x : merge xt ys
| otherwise = y : merge xs yt
如果第二个参数为空,则给出第一个参数
merge xs [] = xs
merge xs@(x:xt) ys@(y:yt) | x <= y = x : merge xt ys
| otherwise = y : merge xs yt
merge xs@(x:xt)ys@(y:yt)|x让我们逐行分解:
merge[]ys=ys
此线型与第一个列表中的匹配。如果第一个列表是空列表(即[]
),则返回第二个列表
merge xs[]=xs
与之前相同,只是列表角色颠倒了
merge xs@(x:xt)ys@(y:yt)
类似于(x:xt)
的模式匹配仅在列表元素为非空时匹配。如果匹配,则将x
设置为第一个元素,xt
设置为列表的其余部分。请记住,:
是列表构造函数操作符(即,1:[2,3]==[1,2,3]
)。
xs@...
前缀表示整个列表设置为xs
。如果您需要同时引用整个列表以及它的头部和尾部,这将非常有用
函数模式在它的两个参数上都匹配。让我们看一下每个单独的条款:
merge [] ys = ys
因此,合并一个空列表和另一个列表ys将得到ys
merge xs [] = xs
这就像第一个子句,正好相反:合并一个列表xs和一个空列表得到xs
merge xs@(x:xt) ys@(y:yt) | x <= y = x : merge xt ys
| otherwise = y : merge xs yt
merge xs@(x:xt)ys@(y:yt)| x从我看到的这个函数合并两个排序列表,并返回一个排序列表。你不明白的是什么?是语法吗?是的,请参阅我的编辑。谢谢。看。关于xs@(x:xt)和ys@(y:yt)签名呢?@csreap3r添加了占位符的解释。“管道”的使用基本上是条件语句吗?是的!他们被称为“卫兵”@csreap3r我推荐阅读这本好书