
On 8/02/2011, at 3:47 AM, Gábor Lehel wrote:
I dunno. As a language extension, would - let's call it BangTypes - be backwards-incompatible in any way?
Let's look at an intermediate step first, BangFunctions. What this does is to say that there are two versions of "->": t1 -> t2 What we have right now, which might be evaluated or not. !t1 -> t2 The function wants its argument evaluated. Suppose f is a value of this type. Then a use of f is rather like a use of (\x -> x `seq` f x) and we can already write that. Now if you write f :: !t1 -> t2 f p1 = e1 ... f pn = en you're making the function strict whether it would have been strict or lazy. But again, with BangPatterns we can already do that: f !(p1) = e1 ... f !(pn) = en The advantage of BangPatterns is that they can be precisely and selectively located. The advantages of BangFunctions include - the forced strictness is part of the function's (published) *interface*, not its implementation - the question of what happens if some patterns for an argument are banged and some are not does not arise (I *think* that this can avoid some mistakes) - it's compatible with BangTypes but simpler. So in some sense there is (now) nothing new here *except* putting the information where people can easily see it. BangTypes could be rather more complicated. Clean 2 offers lazy, head strict spine lazy, head lazy spine strict, head and spine strict, head unboxed spine lazy, head unboxed spine strict for lists, which are all different types; it also offers strictness-polymorphic lists. I never actually made use of this because having so many kinds of list made my head spin. Roughly speading, Clean 1 had BangFunctions, Clean 2 BangTypes. One of the things that makes me wary of BangPatterns is that it seems as though it's headed in a BangTypes kind of direction. Oh, by the way, I got the Clean syntax wrong. ![a] means "lazy list evaluated to WHNF"; [a!] means "value is spine strict".