Passing typeclasses as parameters?
Hi all. I managed to paint myself in a corner where I did this:
data ShowDynamic = forall a . (Show a) => SD Dynamic a toShowDyn a = SD (toDyn a) a fromShowDyn (SD d a) = fromDynamic d
instance Show ShowDynamic where ...
Then I began to wonder if there was any hack to do:
data AnyDynamic X = forall a . (X a) => AD Dynamic a
which could be kinda neat, but I saw no obvious way to do this. Ideas? - Ville (bound to be slain by curiosity)
On Fri, Mar 14, 2008 at 8:06 AM, Ville Tirronen <aleator@gmail.com> wrote:
Hi all.
I managed to paint myself in a corner where I did this:
data ShowDynamic = forall a . (Show a) => SD Dynamic a toShowDyn a = SD (toDyn a) a fromShowDyn (SD d a) = fromDynamic d
instance Show ShowDynamic where ...
Then I began to wonder if there was any hack to do:
data AnyDynamic X = forall a . (X a) => AD Dynamic a
which could be kinda neat, but I saw no obvious way to do this. Ideas?
You can't abstract over type classes, but you can abstract over a dictionary. data ShowD a = ShowD { showD :: a -> String } data AnyDynamic dict = forall a. AD Dynamic (dict a) On the other hand, if all you need is some fixed intersection of classes, it's better to make your own Dynamic. data ShowableDynamic = forall a. (Show a, Typeable a) => SD a toShowDyn :: (Show a, Typeable a) => a -> ShowableDynamic toShowDyn = SD fromShowDyn :: (Show a, Typeable a) => ShowableDynamic -> Maybe a fromShowDyn (SD a) = cast a Finally, you can make your own dynamic augmented with an arbitrary dictionary: data AnyDynamic dict = forall a. (Typeable a) => AD a (dict a) -- Dave Menendez <dave@zednenem.com> <http://www.eyrie.org/~zednenem/>
participants (2)
-
David Menendez -
Ville Tirronen