| > * The fact that you are even allowed to let/where-bind values with
| > unlifted type is surprising. Making it clearer that something odd is
| > going on is a good thing. If it were up to me I think I would
| > disallow them completely.
GHC "grew" let-bindings for unlifted types almost by accident; it was not a
carefully designed feature.
It does seem odd to me that the meaning of
let x = e in b
(and of course its desugaring) varies dramatically depending on the *type* of
x. Normally it's
(A) "evaluate b, and evaluate e if necessary".
But if x has unlifted type you get
(B) "evaluate e then evaluate b"
Now (B) is precisely what you get if you say
let !x = e in b
regardless of the type of x. So the change we're discussing [requiring a !
when x is unlifted] makes the evaluation order consistent with the syntax,
rather than only with the (invisible) type.
As another example consider this
fix (\~(C x y) -> e)
If you omit the ~, the knot tied by fix will go into a black hole, so it's very
important. OK, so now suppose 'x' changes type and becomes unlifted. Black
hole!
Under the new rules you'd get an error, because a variable of unlifted type is
bound by a lazy pattern.
Remember that let/where bindings behave very like lazy patterns. (See the
desugaring in the Report.)
Anyway, that's why I think this change is a good thing. IAN: we need to make
sure the user manual reflects all this!
| Suppose I have
|
| foo :: (Int# -> Int#) -> Array Int -> Array Int
|
| I don't see a good way of getting this semantics without using unboxed
| types.
Max is working on a this very point. Stay tuned.
Simon
_______________________________________________
Cvs-ghc mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-ghc