Casting + eta reduction

2010-07-08 Thread Louis Wasserman
Consider newtype Foo = Foo Int lift :: (Int -> a) -> Foo -> a lift f (Foo x) = f x Now, I'd expect this to compile with -O2 down to something like lift f = f `cast` (Foo -> a) but it doesn't. It seems that GeneralizedNewtypeDeriving assumes that these two things *are* equivalent, and it just

Re: Lazy IO and asynchronous callbacks?

2010-07-08 Thread Evan Laforge
On Thu, Jul 8, 2010 at 3:25 PM, J. Garrett Morris wrote: > Hello everyone, > > I'm currently in the process of wrapping a C API, and I've run across > an interesting possibility.  Basically, the C API exposes non-blocking > versions of some potentially long-running operations, and will invoke > a

Lazy IO and asynchronous callbacks?

2010-07-08 Thread J. Garrett Morris
Hello everyone, I'm currently in the process of wrapping a C API, and I've run across an interesting possibility. Basically, the C API exposes non-blocking versions of some potentially long-running operations, and will invoke a callback to indicate that the long running operation has finished. Fo

Re: unsafeCoerce# between integral and floating point types

2010-07-08 Thread John Meacham
On Thu, Jul 08, 2010 at 04:49:00PM +0200, Daniel Fischer wrote: > If there are more pitfalls, is there any chance of getting a function which > reinterprets the bit-patterns? Hi, you can do something like this (untested): castWordToFloat :: Word32 -> Float castWordToFloat w = unsafePerformIO $ d

Re: unsafeCoerce# between integral and floating point types

2010-07-08 Thread Daniel Fischer
On Thursday 08 July 2010 18:15:44, Ian Lynagh wrote: > On Thu, Jul 08, 2010 at 04:49:00PM +0200, Daniel Fischer wrote: > > unsafeCoerce# :: Word64# -> Double# ? > > > > By the docs, that isn't supposed to work. Is it not supposed to work > > only because it's not value-preserving (unsafeCoerce# 1##

Re: unsafeCoerce# between integral and floating point types

2010-07-08 Thread Ian Lynagh
On Thu, Jul 08, 2010 at 04:49:00PM +0200, Daniel Fischer wrote: > > unsafeCoerce# :: Word64# -> Double# ? > > By the docs, that isn't supposed to work. Is it not supposed to work only > because it's not value-preserving (unsafeCoerce# 1## /=## 1.0##) or are > there more pitfalls? It can fail t

unsafeCoerce# between integral and floating point types

2010-07-08 Thread Daniel Fischer
The docs for unsafeCoerce# say: "The following uses of unsafeCoerce# are supposed to work (i.e. not lead to spurious compile-time or run-time crashes): # Casting any lifted type to Any # Casting Any back to the real type # Casting an unboxed type to another unboxed type of the same size (but not