>>
>> f f = f
>>
Hans> Haskell translates f f = f into f := f |-> f; on the right hand side
Hans> "f" is a bound variable, on the left hand side "f" is a name. Suppose I
Hans> inidicate variables with a slash, then the formula would read
Hans> f := \f |-> \f
Hans> or f(\f) := \f.
I don't really understand your remark. f f = f as a toplevel
definition is equivalent to (in this special case)
letrec ...
f = \f -> f
...
Hans> So Haskell allows different logical entities have the same name dependent
Hans> on the context, which causes the confusion.
It's not different logical entities, all occurrences of f are variables.
It's not Haskell that's causing the confusion if any, it's the lambda
calculus, more precisely: alpha-conversion.
-Peter