On Sat, 2009-09-05 at 23:35 -0400, Isaac Dupree wrote: > Maciej Piechotka wrote: > > 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 > > -- ... > > That isn't GADT syntax... results of "Constructor :: ..." must be > "Closure" in this case.
Sorry. To much delete: data Closure where Closure0 :: IO a -> Closure Closure1 :: (a -> IO b) -> Closure Closure2 :: (a -> b -> IO c) -> Closure ... > What are you trying to do here? An alternative > for "Ptr (StablePtr Any)"? Is "Ptr (StablePtr Dynamic)" sufficient, > where Dynamic from Data.Dynamic is represented in an > implementation-specific way equivalent to > data Dynamic = forall a. Typeable a => DynamicConstr a > a.k.a. > data Dynamic where DynamicConstr :: Typeable a => a -> Dynamic > ? > The main limitation would be if you want to include a type that's not in > Typeable. Is that common, to have types that aren't in Typeable? > Point taken. Regards
signature.asc
Description: This is a digitally signed message part
_______________________________________________ Haskell-prime mailing list Haskell-prime@haskell.org http://www.haskell.org/mailman/listinfo/haskell-prime