我有这段代码:
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
。