Search code examples
haskellat-sign

What does '@' mean in Haskell?


I've tried googling but come up short. I am furthering my Haskell knowledge by reading some articles and I came across one that uses a syntax I've never seen before. An example would be:

reconstruct node@(Node a b c l r) parent@(Node b d le ri)

I've never seen these @'s before. I tried searching online for an answer but came up short. Is this simply a way to embed tags to help make things clearer, or do they have an actual impact on the code?


Solution

  • It is used in pattern matching. Now node variable will refer to the entire Node data type for the argument Node a b c l r. So instead of passing to the function as Node a b c l r, you can use node instead to pass it up.

    A much simpler example to demonstrate it:

    data SomeType = Leaf Int Int Int | Nil deriving Show
    
    someFunction :: SomeType -> SomeType
    someFunction leaf@(Leaf _ _ _) = leaf
    someFunction Nil = Leaf 0 0 0
    

    The someFunction can also be written as:

    someFunction :: SomeType -> SomeType
    someFunction (Leaf x y z) = Leaf x y z
    someFunction Nil = Leaf 0 0 0
    

    See how simpler was the first version ?