Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 解释一下';合并';Haskell函数_Sorting_Haskell_Mergesort - Fatal编程技术网

Sorting 解释一下';合并';Haskell函数

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

我正在学习Haskell,在理解这个函数时遇到了困难。我正在执行合并排序。我已经实现了mergesort递归函数,但我不明白这个“merge”函数在做什么。我理解命令式语言中的合并排序,但我不理解这里的语法

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我推荐阅读这本好书