# = vs ->

**Ketil Malde
**
ketil@ii.uib.no

*10 Oct 2001 08:28:35 +0200*

Mark Carroll <mark@chaos.x-philes.com> writes:
>* On Tue, 9 Oct 2001, Ashley Yakeley wrote:
*
>>* At 2001-10-09 11:55, Mark Carroll wrote:
*
>>>* What is the rationale for when Haskell demands a "=" and when it
*>>>* demands a "->"?
*
Okay, I can't give you anything formal, but here's my intuitive
understanding of things
>* e.g.
*
>* x :: Integer -> Integer
*
A function "from" and Integer to an Integer. Even more obvious if you
have one more parameter:
g :: Integer -> Integer -> Integer
g takes an Integer and returns a function that takes an Integer and
returns an Integer. Equals-assignment would be very non-intuitive
here.
I guess the same argument goes for lambdas
\x -> x*x
maps *from* an x *to* its square.
>* x 1 = 1
*>* x 2 = 3
*
Function definitions use (=). I'm not sure I see any really
compelling reason, except that it's the usual math syntax, and arrows
would look weird, in particular with nullary definitions:
c -> 0
>* y a =
*>* case a of
*>* 1 -> 1
*>* 2 -> 3
*
>* z a
*>* | a == 1 = 1
*>* | a == 2 = 3
*
It seems there's a predisposition for having exactly one (=) in
function definitions. Perhaps one could have had a syntax like
z a =
| a == 1 -> 1
| a == 2 -> 3
instead, as it'd make it more consisten with the case, but I suppose
there's a reason for it being the way it is. The case statement is an
expression like any other, while I suspect the guards can only be used
in function definitions like your 'z' example.
By the way, if you read '=' as "is assigned to", and '|' as "where"
and '->' as "gives", things mostly make sense, I think.
(Note that there's also the back-arrow, used to "draw from", e.g. in
the IO Monad
main = do
x <- readFile "/etc/passwd"
putStr (map crack (lines x))
or list comprehensions
primes = [ p | p <- [2..], noDivides p primes]
I suppose the difference from (=) assignment is reasonably clear.)
Rambling on,
-kzm
--
If I haven't seen further, it is by standing in the footprints of giants