Paul,
> In trying to follow your email I got a bit confused by your notation -
>> const :: a -> b -> a const x y = x could read a -> {S} -> b -
> >{L} a
>> Here, we have annotated the function-space constructor (->) with
> information about whether the corresponding function is strict or
> lazy in its argument. Indeed, const is lazy in its first argument
> and lazy in its second.
>> Did you mean to say that const is strict in its first param and lazy
> in its second (since const _|_ y = _|_)? Also, can you explain your
> notation, how does a -> {S} -> b ->{L} a indicate the strictness?
> Why not just {S} a -> {L} b -> a?
I'm sorry for the confusion. Indeed, const, as the type was intended
to reflect, const is strict in its first argument and lazy in its
second.
I prefer to put the annotation on the function arrow as strictness is
a property of functions, but if you want to have these annotations
prefixing the argument types, then I guess that's fine as well; in the
end, it really doesn't matter, does it?
Cheers,
Stefan