Is using Data.Dynamic considered a no-go?

Haskell seems to have pretty strong support for dynamic casting using Data.Typeable and Data.Dynamic. All kinds of funky dynamic programming seems to be possible with these "hacks". Is this considered as being as bad as - say - unsafePerformIO? What kind of evil is lurking here? Cheers, Peter

bugfact:
Haskell seems to have pretty strong support for dynamic casting using Data.Typeable and Data.Dynamic.
All kinds of funky dynamic programming seems to be possible with these "hacks".
Is this considered as being as bad as - say - unsafePerformIO? What kind of evil is lurking here?
Inefficiencies and runtime errors? -- Don

Peter Verswyvelen
Haskell seems to have pretty strong support for dynamic casting using Data.Typeable and Data.Dynamic. All kinds of funky dynamic programming seems to be possible with these "hacks".
Is this considered as being as bad as - say - unsafePerformIO? What kind of evil is lurking here?
Uncertainty. Noone on #haskell seems to know how Typeable-dispatches compare to pattern matching wrt. performance, and I was either too lazy or too uninterested to measure it myself. Combined with a custom type class and existentials, they safe you from writing catch-all ADTs and thus give code flexibility (and conciseness), while retaining static typing, modulo unexhaustive pattern warnings. This is how XHB uses Typeable, and, IMHO, it's a Good Thing. -- (c) this sig last receiving data processing entity. Inspect headers for copyright history. All rights reserved. Copying, hiring, renting, performance and/or quoting of this signature prohibited.

They are not unsafe in the way unsafePerformIO is, but I regard them
as a last resort in certain situations.
Still, in those situations they are very useful.
-- Lennart
2009/2/12 Peter Verswyvelen
Haskell seems to have pretty strong support for dynamic casting using Data.Typeable and Data.Dynamic. All kinds of funky dynamic programming seems to be possible with these "hacks". Is this considered as being as bad as - say - unsafePerformIO? What kind of evil is lurking here? Cheers, Peter
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe

On Thu, 2009-02-12 at 19:04 +0100, Lennart Augustsson wrote:
They are not unsafe in the way unsafePerformIO is,
I beg permission to demur: newtype Unsafe alpha = Unsafe { unUnsafe :: alpha } instance Typeable (Unsafe alpha) where typeOf _ = typeOf () pseudoSafeCoerce :: alpha -> Maybe beta pseudoSafeCoerce = fmap unUnsafe . cast . Unsafe Note that pseudoSafeCoerce = Just . unsafeCoerce
but I regard them as a last resort in certain situations. Still, in those situations they are very useful.
But I would agree with both of these. As long as you *derive* Typeable. jcc

You're quite right. You should only be allowed to derive Typeable.
(Which could be arranged by hiding the methods of typeable.)
On Thu, Feb 12, 2009 at 6:24 PM, Jonathan Cast
On Thu, 2009-02-12 at 19:04 +0100, Lennart Augustsson wrote:
They are not unsafe in the way unsafePerformIO is,
I beg permission to demur:
newtype Unsafe alpha = Unsafe { unUnsafe :: alpha } instance Typeable (Unsafe alpha) where typeOf _ = typeOf ()
pseudoSafeCoerce :: alpha -> Maybe beta pseudoSafeCoerce = fmap unUnsafe . cast . Unsafe
Note that
pseudoSafeCoerce = Just . unsafeCoerce
but I regard them as a last resort in certain situations. Still, in those situations they are very useful.
But I would agree with both of these. As long as you *derive* Typeable.
jcc
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe

It would be interesting to see when you HAVE to use dynamics, e.g. when no
other solution is possible in Haskell...
Right now if I use it, it feels that I'm doing so because I'm too new to
Haskell.
On Thu, Feb 12, 2009 at 7:53 PM, Lennart Augustsson
You're quite right. You should only be allowed to derive Typeable. (Which could be arranged by hiding the methods of typeable.)
On Thu, Feb 12, 2009 at 6:24 PM, Jonathan Cast
wrote: On Thu, 2009-02-12 at 19:04 +0100, Lennart Augustsson wrote:
They are not unsafe in the way unsafePerformIO is,
I beg permission to demur:
newtype Unsafe alpha = Unsafe { unUnsafe :: alpha } instance Typeable (Unsafe alpha) where typeOf _ = typeOf ()
pseudoSafeCoerce :: alpha -> Maybe beta pseudoSafeCoerce = fmap unUnsafe . cast . Unsafe
Note that
pseudoSafeCoerce = Just . unsafeCoerce
but I regard them as a last resort in certain situations. Still, in those situations they are very useful.
But I would agree with both of these. As long as you *derive* Typeable.
jcc
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe

Notably, extensible exceptions use dynamics, in conjunction with type classes and existentials. A number of solutions to the 'expression problem' involve dynamics. bugfact:
It would be interesting to see when you HAVE to use dynamics, e.g. when no other solution is possible in Haskell...
Right now if I use it, it feels that I'm doing so because I'm too new to Haskell.
On Thu, Feb 12, 2009 at 7:53 PM, Lennart Augustsson
wrote: You're quite right. You should only be allowed to derive Typeable. (Which could be arranged by hiding the methods of typeable.)
On Thu, Feb 12, 2009 at 6:24 PM, Jonathan Cast
wrote: > On Thu, 2009-02-12 at 19:04 +0100, Lennart Augustsson wrote: >> They are not unsafe in the way unsafePerformIO is, > > I beg permission to demur: > > newtype Unsafe alpha = Unsafe { unUnsafe :: alpha } > instance Typeable (Unsafe alpha) where > typeOf _ = typeOf () > > pseudoSafeCoerce :: alpha -> Maybe beta > pseudoSafeCoerce = fmap unUnsafe . cast . Unsafe > > Note that > > pseudoSafeCoerce = Just . unsafeCoerce > >> but I regard them >> as a last resort in certain situations. >> Still, in those situations they are very useful. > > But I would agree with both of these. As long as you *derive* Typeable. > > jcc > > > _______________________________________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe > _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe

SYB makes very heavy use of Typeable as well, although not, as I recall dynamics as such. Cheers, Sterl. On Feb 12, 2009, at 3:40 PM, Don Stewart wrote:
Notably, extensible exceptions use dynamics, in conjunction with type classes and existentials.
A number of solutions to the 'expression problem' involve dynamics.
bugfact:
It would be interesting to see when you HAVE to use dynamics, e.g. when no other solution is possible in Haskell...
Right now if I use it, it feels that I'm doing so because I'm too new to Haskell.
On Thu, Feb 12, 2009 at 7:53 PM, Lennart Augustsson
wrote: You're quite right. You should only be allowed to derive Typeable. (Which could be arranged by hiding the methods of typeable.)
On Thu, Feb 12, 2009 at 6:24 PM, Jonathan Cast
wrote: On Thu, 2009-02-12 at 19:04 +0100, Lennart Augustsson wrote:
They are not unsafe in the way unsafePerformIO is,
I beg permission to demur:
newtype Unsafe alpha = Unsafe { unUnsafe :: alpha } instance Typeable (Unsafe alpha) where typeOf _ = typeOf ()
pseudoSafeCoerce :: alpha -> Maybe beta pseudoSafeCoerce = fmap unUnsafe . cast . Unsafe
Note that
pseudoSafeCoerce = Just . unsafeCoerce
but I regard them as a last resort in certain situations. Still, in those situations they are very useful.
But I would agree with both of these. As long as you *derive* Typeable.
jcc
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
participants (6)
-
Achim Schneider
-
Don Stewart
-
Jonathan Cast
-
Lennart Augustsson
-
Peter Verswyvelen
-
Sterling Clover