理解Haskell中的as-pattern

3

我正在阅读《Real World Haskell》并尝试理解模式匹配中的as-pattern。

书中(第4章)所述:

suffixes :: [a] -> [[a]]
suffixes xs@(_:xs') = xs : suffixes xs'
suffixes _ = []

这本书如此解释@符号:

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

我无法理解这个解释。假设我调用

suffixes "hello"

具体来说,上述带有@符号的代码在第一次迭代中会对此代码执行什么操作?我知道函数的结果是什么,但不知道如何从上面的代码得到结果。


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - duplode
2个回答

16

xs'将与字符串"ello"绑定。

xs将与字符串"hello"绑定。

@模式允许您为变量命名,同时匹配其结构并可能为组件命名。


9
也许实际的“去糖化”会更易于理解:
suffixes xs@(_:xs') = xs : suffixes xs'

等同于

suffixes xs
 | (_:xs') <- xs   = xs : suffixes xs'

你首先将整个参数绑定到变量xs,然后在同一参数(或等效地,在xs上)上进行模式匹配以匹配(_:xs')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接