我有这样的代码:
mix xxs@(x:xs) yys@(y:ys)
| x<=y = x : mix xs yys
| otherwise = y : mix xxs ys
但是我不知道@
是什么意思。
这不是操作符;它是模式语法的一部分。在yys@(y:ys)
的情况下,如果第二个参数成功匹配(y:ys)
,则匹配的整个值也被绑定到yys
。
因此,如果调用min [1,2] [3,4]
,则y
将绑定到3
,ys
绑定到[4]
,yys
绑定到[3,4]
。
这是一个as-pattern[Haskell教程],它用于引用整个列表xxs
,列表的头部x
和列表的尾部xs
(当然第二个列表也是如此)。
模式只有在所有子模式都匹配时才会触发,所以在本例中,如果两个列表都是非空的。它经常被用作优化,因为现在您可以在函数体中使用第一个或第二个参数xxs
或yys
。