
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 http://www.haskell.org/onlinereport/exps.html#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) versus 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. -- Chris