理解Haskell as-pattern

1 haskell pattern-matching

我正在阅读Real World Haskell,并试图理解as-pattern.

从这本书(第4章):

suffixes :: [a] -> [[a]]
suffixes xs@(_:xs') = xs : suffixes xs'
suffixes _ = []
Run Code Online (Sandbox Code Playgroud)

这本书解释了@符号,

"...将变量xs绑定到与@符号右侧匹配的值."

我无法理解这个解释.假设我打电话

suffixes "hello"
Run Code Online (Sandbox Code Playgroud)

明确地说,上面那行与@做了什么(在第一次迭代中)?我知道函数的结果是什么,但无法看到我们如何从上面的代码到达那里.

Pti*_*val 9

xs'将绑定到字符串"ello".

xs将绑定到字符串"hello".

@模式允许您为变量指定名称,同时还匹配其结构并可能为组件指定名称.


lef*_*out 6

也许实际的“脱糖”会更容易理解:

suffixes xs@(_:xs') = xs : suffixes xs'
Run Code Online (Sandbox Code Playgroud)

相当于

suffixes xs
 | (_:xs') <- xs   = xs : suffixes xs'
Run Code Online (Sandbox Code Playgroud)

即,您首先将整个参数绑定到变量xs,但您还对同一个参数(或等效地, on xs)进行模式匹配to (_:xs')