# [Haskell-cafe] what does @ mean?.....

Nicholls, Mark Nicholls.Mark at mtvne.com
Fri Dec 28 06:05:55 EST 2007

```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 long version, explaining what everything means is....

here's a definition of multiplication on natural numbers I'm reading

on a blog....

data Nat = Z | S Nat

deriving Show

one :: Nat

one = (S Z)

mulNat :: Nat -> Nat -> Nat

mulNat _ Z = Z

mulNat Z _ = Z

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

Haskell programmers seem to have a very irritating habit of trying to

be overly concise...which makes learnign the language extremely

hard...this example is actually relatively verbose....but anyway...

Z looks like Zero...S is the successor function...Nat are the

"Natural" numbers.....

mulNat _ Z = Z

mulNat Z _ = Z

translates to...

x * 0 = 0....fine...

0 * x = 0....fine..

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

is a bit more problematic...

lets take a as 3 and b as 5...

so now we have

mulNat' 3 5 5

but what does the "x@(S a)" mean? in

mulNat' x@(S a) y orig

________________________________

Sent: 21 December 2007 17:47
To: David Menendez
Subject: RE: [Haskell-cafe] nice simple problem for someone
struggling....

Let me resend the code...as it stands....

module Main where

data SquareType numberType = Num numberType => SquareConstructor
numberType

class ShapeInterface shape where

area :: Num numberType => shape->numberType

data ShapeType = forall a. ShapeInterface a => ShapeType a

instance (Num a) => ShapeInterface (SquareType a) where

area (SquareConstructor side) = side * side

and the errors are for the instance declaration.......

[1 of 1] Compiling Main             ( Main.hs, C:\Documents and

Main.hs:71:36:

Couldn't match expected type `numberType' against inferred type `a'

`numberType' is a rigid type variable bound by

the type signature for `area' at Main.hs:38:15

`a' is a rigid type variable bound by

the instance declaration at Main.hs:70:14

In the expression: side * side

In the definition of `area':

area (SquareConstructor side) = side * side

I'm becoming lost in errors I don't comprehend....

What bamboozles me is it seemed such a minor enhancement.

________________________________

From: d4ve.menendez at gmail.com [mailto:d4ve.menendez at gmail.com] On Behalf
Of David Menendez
Sent: 21 December 2007 17:05
To: Nicholls, Mark
Subject: Re: [Haskell-cafe] nice simple problem for someone
struggling....

On Dec 21, 2007 11:50 AM, Nicholls, Mark <Nicholls.Mark at mtvne.com>
wrote:

Now I have....

module Main where

data SquareType numberType = Num numberType => SquareConstructor
numberType

This is a valid declaration, but I don't think it does what you want it
to. The constraint on numberType applies only to the data constructor.

That is, given an unknown value of type SquareType a for some a, we do
not have enough information to infer Num a.

For your code, you want something like:

instance (Num a) => ShapeInterface (SquareType a) where
area (SquareConstructor side) = side * side

--
Dave Menendez <dave at zednenem.com>
<http://www.eyrie.org/~zednenem/ >

-------------- next part --------------
An HTML attachment was scrubbed...