Cast uses unsafeCoerce. but well, itīs more elegant ;)


2009/12/26 Miguel Mitrofanov <miguelimo38@yandex.ru>
On 26 Dec 2009, at 12:45, Alberto G. Corona wrote:

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

That's gross. Don't use unsafe functions unless you really need one.


data Bar = forall a. (BarLike a, Typeable a) => Bar a
unwrapBar :: 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