我正在阅读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)
明确地说,上面那行与@做了什么(在第一次迭代中)?我知道函数的结果是什么,但无法看到我们如何从上面的代码到达那里.
也许实际的“脱糖”会更容易理解:
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')。