Possible runtime overhead of wrapping the IO monad?

Benjamin Franksen benjamin.franksen at bessy.de
Fri Mar 31 08:08:19 EST 2006

On Thursday 30 March 2006 14:13, Brian Hulley wrote:
> John Meacham wrote:
> > On Thu, Mar 30, 2006 at 03:50:06AM +0100, Brian Hulley wrote:
> >> where the intention is that the callback will take the width and
> >> height of the window and return a RenderM action, the problem is
> >> that because the FFI does not allow RenderM to appear in a foreign
> >> type.
> >
> > it should, the types in foreign declarations should "see through"
> > newtypes.
> Unfortunately GHC does not seem to support this:
>    foreign import ccall duma_clear :: Word.Word32 -> RenderM ()
>        Unacceptable result type in foreign declaration: RenderM ()
>        When checking declaration:
>        foreign import ccall safe "static  &duma_clear"
>             duma_clear :: GHC.Word.Word32 -> RenderM ()
> even though the FFI spec agrees with you (Section 3.2):
>      The argument types ati produced by fatype must be
>      marshallable foreign types; that is, each ati is either (1)
>      a basic foreign type or (2) a type synonym or renamed
>      datatype of a marshallable foreign type. Moreover, the
>      result type rt produced by frtype must be a
>      marshallable foreign result type; that is,
>      it is either a marshallable foreign type, ...

Note that the addendum continues 

"...that is, it is either a marshallable foreign type, the type (), or a 
type matching Prelude.IO t, where t is a marshallable foreign type or 

Nowhere is it written that 'IO t' (in itself) is a marshallable type 
whenever 't' is a marshallable type.

[I am not sure what it means exactly if a type "matches" 'Prelude.IO 

Thus, GHC does nothing wrong, according to the addendum. That doesn't 
mean allowing IO-equivalent newtypes wouldn't be a good idea. It is 
just not written in the addendum.


More information about the Glasgow-haskell-users mailing list