
On 21/04/2010 09:45, Roman Leshchinskiy wrote:
After thinking about this for a while, I came up with two possible solutions. One is to provide a "pure" version of touch#:
use# :: o -> o' -> o'
such that use# x y = y. This would change the code above to:
I# (use# arr# (indexIntOffAddr# addr# i#))
I don't know how to implement this, though, because use# would have to be able to return arbitrary (unboxed) types and the code generator doesn't really seem to support this.
A perhaps simpler solution is to add a new set of primitives:
indexIntOffAddrUsing# :: o -> Addr# -> Int# -> Int# ...
These would take an additional argument which they'd touch and otherwise ignore. The code would then become:
I# (indexIntOffAddrUsing# arr# addr# i#)
Seems like the way to go, I can't think of a better alternative.
Incidentally, the index*OffAddr# primitives don't seem to be used anywhere.
There are a handful of uses in libraries/base, mainly GHC.Base. Cheers, Simon