[Haskell-cafe] Re: what does @ mean?.....

ChrisK haskell at list.mightyreason.com
Fri Dec 28 06:31:50 EST 2007

Nicholls, Mark wrote:
> Hello, I wonder if someone could answer the following…
> The short question is what does @ mean in
> mulNat a b
>     | a <= b = mulNat' a b b
>     | otherwise = mulNat' b a a
>     where
>          mulNat' x@(S a) y orig
>                  | x == one = y
>                  | otherwise = mulNat' a (addNat orig y) orig

The @ means an as-pattern as defined in the Haskell 98 report section 3.17.1

The 'x' binds to the whole (S a) and the 'a' binds to the parameter of the
constructor 's'.

There is a possible performance benefit here.  Consider:

zeroNothing Nothing = Nothing
zeroNothing (Just n) =
  if n == 0 then Nothing else (Just n)


zeroNothing Nothing = Nothing
zeroNothing x@(Just n) =
  if n == 0 then Nothing else x

The first example takes apart the (Just n) and later reconstructs (Just n).
Unless the compiler is fairly clever, this will cause the new (Just n) to be a
new allocation instead of reusing the input value.  The second form uses an
at-pattern to bind 'x' to the whole input parameter and the returned 'x' will
not need to be reallocaed.


More information about the Haskell-Cafe mailing list