_______________________________________________
Haskell-Cafe mailing list
Haskel...@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
> 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
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 <migue...@yandex.ru>
adjustToBox (ObjectWrapper object) box = adjustToBox object box
but what you've probably intended to write was
adjustToBox (ObjectWrapper object) box = ObjectWrapper (adjustToBox
object box)
It has nothing to do with existentials - it's a simple type mismatch.