On 26 Dec 2009, at 12:45, Alberto G. Corona wrote:That's gross. Don't use unsafe functions unless you really need one.
You can also make use of Typeable and unsafeCoerce (Data.Dynamic style)
data Bar = forall a. (BarLike a, Typeable a) => Bar a
unwrapBar :: Bar -> a
unwrapBar (Bar x) = case typeof x== typeof a of
True -> unsafeCoerce x
False -> error $ "casting error for type: "++ typeOf a
unwrapBar :: Typeable a => Bar -> a
data Bar = forall a. (BarLike a, Typeable a) => Bar a
unwrapBar (Bar x) = fromMaybe (error $ "casting error for type: " ++ show (typeOf x)) $ cast x
2009/12/26 Miguel Mitrofanov <miguelimo38@yandex.ru>
On 26 Dec 2009, at 11:58, haskell@kudling.de wrote:
class BarLike a where
doSomething :: a -> Double
data Bar = forall a. BarLike a => Bar a
unwrapBar :: Bar -> a
unwrapBar (Bar x) = x
How can i deconstruct the enclosed value of type a?
You can't write a function with a type that mentions existentially quantified "a". Period.
But you can deconstruct the enclosed value temporarily:
getSomething :: Bar -> Double
getSomething b =
case b of
Bar a -> doSomething a
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe