
Mark Carroll 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