ANN: H98 FFI Addendum 1.0, Release Candidate 10

Ross Paterson ross@soi.city.ac.uk
Mon, 9 Jun 2003 23:33:39 +0100


On Sun, Jun 08, 2003 at 10:36:48PM +1000, Manuel M T Chakravarty wrote:
> Done.
> Done.
> Done.

Thanks, that's much safer.  It's just nitpicking now, but:

> > Having washed our hands of unsafePerformIO applied to non-deterministic
> > actions, we no longer need the third paragraph, which (though scary)
> > provides no useful guidance:
> > 
> > - Great care should be exercised in the use of this function.  Not only
> > - because of the danger of introducing side effects, but also because
> > - \code{unsafePerformIO} may compromise typing, for example, when it is used
> > - in conjunction with polymorphic references.
> 
> I don't quite agree with this.  John's IORef example is
> indeed outlawed by the determinism requirement.  However, it
> is possible to construct examples that are deterministic,
> but still dubious from a typing perspective.  Let's assume a
> C routine
> 
>   void *foo();
> 
> that *always returns the same pointer* to a buffer area.  To
> bind this in Haskell as
> 
>   foreign import ccall foo :: Ptr a
> 
> is problematic[1].

I wouldn't consider that an environment-independent value.

> Great care should be exercised in the use of this function.  Not only
> because of the danger of introducing side effects, but also because
> \code{unsafePerformIO} may compromise typing; in particular, the result of
> \code{unsafePerformIO} should always have a monomorphic type.

Unlike the other restrictions, this one could be checked by a compiler,
but perhaps it's too strict.  The problem isn't polymorphism as
such, but polymorphic storage references, and I claim they're either
environment-dependent or ill-typed.  I also suspect there may be some
perfectly reasonable polymorphic examples, though I can't think of a
realistic example offhand.

In any case, it's not accurate to call it a function.

> Moreover, we could use a stable pointer to store a reference
> to an IORef in C land and use this to construct something
> not unlike John's example.  In contrast, to John's example,
> we would always get the same IORef (so the function is
> deterministic), but could still give it the polymorphic type
> that it shouldn't have.

I don't see how this will fly.

Typo: in 6.2 CTypes, the second and third bulleted paras have T for CT.