I’ve seen syntax like:
let !s = f x
from time to time (for example in Marlows Book) but I never reall knew what this really is, nor where I should look for it.
Today I stumpled upon the Bang patterns extension to GHC – and voila – here we go.
So what is it?
If we add the extension we can force evalutation wo WHNF (weak head normal form – more or less evaluated “one step”) by just adding a !(Bang) in front of an identifier – and this extents to pattern-matching as well (this and the fact that is’s shorter to write and better to read makes it so much better then seq).
Here are a few examples showing a bit of it’s power/capabilities:
let makeTuple() = (1+1, 2+2) let f = makeTuple() :sprint f >> f = _ let !f = makeTuple() :sprint f >>f = (_,_)