Standarize GHC.Prim.Any

Maciej Piechotka uzytkownik2 at gmail.com
Sat Sep 5 16:47:52 EDT 2009


On Thu, 2009-08-20 at 19:59 +0200, Maciej Piechotka wrote:
> Sorry for delay in responding.
> 
> > > Any from GHC.Prim makes unsafeCoerce much useful and safe. Can it be
> > > included in Unsafe.Coerce module?
> > > 
> > > Pros:
> > > - unsafeCoerce is much more useful with Any (it's a safe placeholder for
> > > any value and therefore can be passed simply in/out FFI).
> > 
> > Yes it's a safe placeholder, but so is an existential, I believe...
> > data ContainsAny = forall a. ContainsAny a
> > to put in the container:
> > "ContainsAny x"
> > to remove from the container:
> > "case ... of ContainsAny x -> unsafeCoerce x"
> > Albeit, there might be a slight performance penalty for the extra box, 
> > which can't be removed in all haskell implementations.
> > 
> > Also, what do you mean about "FFI"?  I don't think you can pass the 
> > "Any" type to foreign functions through the FFI...
> > 
> > Also, can/do all compilers that implement unsafeCoerce implement a safe Any?
> > Hugs can do it with just "data Any = Ignored" I believe, not sure about 
> > nhc, yhc or jhc...
> > 
> > -Isaac
> 
> Well. May be I have one specific problem which seems to not be possible
> to be implemented in portable way (I'm not sure if it is possible
> outside ghc). Sorry for mentioning FFI without further explanation.
> 
> The problem arise if one would like to implement GClosure from glib.
> Once it was implemented in gtk2hs in C using RTS API. I also have my own
> implementation in Haskell which is doing something (removed IO monad for
> clarity):
> applyValue :: Any -> Value -> Any
> applyValue f v =
> 	case funsamentalTypeOf v of
> 		Type1 -> (unsafeCoerce f :: HaskellType1 -> Any) $ get v
> 		...
> 
> Such trick is (looks for me?) safe as a -> b -> ... -> d can be
> represented by Any. However I cannot safely cast to function a -> Any.
> 
> To/from FFI it is passed in Ptr (StablePtr Any).
> 
> Regards
> PS. I assume that it is not possible as it was done in importable was in
> gtk2hs. 

With any known from the beginning number of parameters function and GADT
one can write:

data Closure where
	Closure0 :: IO a
	Closure1 :: a -> IO b
	Closure2 :: a -> b -> IO c
	-- ...

However it poses upper build-time limit.

Regards
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: This is a digitally signed message part
Url : http://www.haskell.org/pipermail/haskell-prime/attachments/20090905/2fd0fd1d/attachment.bin


More information about the Haskell-prime mailing list