That’s called an as-pattern. It binds part of the pattern match to a variable. In this case you might want to do that for efficiency reasons. 

You can find an example of them here:
https://www.haskell.org/tutorial/patterns.html

I think your example isn’t correct, the `us` variable is only defined for the last clause. The first two should use `compress ys`. 

Without as-patterns this would look like:

compress (x:y:ys’)
| x==y = compress (y:ys’)
| otherwise = x : compress (y:ys’)
compress us = us

It can be more efficient and concise to use ys@(y:_) in the pattern match and ys elsewhere  instead of having to repeat (y:ys’) which without optimizations would call the : constructor again and may not share memory in the same way. 

-bob


On Sat, Apr 27, 2019 at 07:31 Yugesh Kothari <kothariyugesh@gmail.com> wrote:
This is probably a stupid question but I can't seem to understand the use of @ in haskell pattern matching.

Ex -
compress (x:ys@(y:_))
| x==y = compress us
| otherwise = x : compress us
compress us = us

Thanks!

_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners