我是 Haskell 的初学者。我在 Haskell 中做简单的练习,即编写压缩函数,因为我的这个函数的代码很长,并不是我真正想做的,我检查了解决方案,我找到了这个:
compress (x:ys@(y:_))
| x == y = compress ys
| otherwise = x : compress ys
compress ys = ys
对我来说问题是'@'我真的不知道在做什么,有没有人愿意解释我这是如何工作的?
@
用于将名称绑定到整个模式匹配的值。像这样想
foo fullList@(x:xs) = ...
就像说
foo (x:xs) = ...
where fullList = x:xs
或者,如果你喜欢
foo fullList = case fullList of
(x:xs) -> ...
所以在你的情况下
ys
等于原始列表的尾部,而头部ys
是y
。
值得阅读一个很好的 haskell 教程来学习一些这种语法。
@
用于模式匹配一个值,同时仍然保持对整个值的引用。一个例子是
data Blah = Blah Int Int
f :: Blah -> String
f val@(Blah x y) = -- some expression
f (Blah 1 2)
在最后一次调用中,val
将是Blah 1 2
,x
将是 1 和y
2。
我建议您阅读“为大好而学习 Haskell”的相关部分!
从链接:
还有一种叫做模式的东西。这些是根据模式分解事物并将其绑定到名称同时仍保持对整个事物的引用的便捷方式。您可以通过在模式前面加上名称和 @ 来做到这一点。例如,模式 xs@(x:y:ys)。此模式将与 x:y:ys 完全匹配,但您可以通过 xs 轻松获取整个列表,而不是通过再次在函数主体中键入 x:y:ys 来重复自己。