[Haskell-cafe] Do people use visitor pattern in Haskell...

Christopher Allen cma at bitemyapp.com
Fri Jun 19 16:11:37 UTC 2015


This is a pattern people usually refer to as the "existential typeclass
antipattern".

An article goes into more depth here:
https://lukepalmer.wordpress.com/2010/01/24/haskell-antipattern-existential-typeclass/

Sometimes you need a GADT with an existential type and a typeclass, but it
doesn't occur as often as the equivalent does in OO.

On Fri, Jun 19, 2015 at 10:48 AM, Nicholls, Mark <nicholls.mark at vimn.com>
wrote:

>  My initial guess would be no…its built into the language
>
>
>
> But….
>
>
>
> I find myself tempted to use it (in order to match on a type that’s the
> instance of a typeclass)…which makes me think I’ve missed something.
>
>
>
> So…
>
>
>
> > data Foo = Foo
>
> > data Bar = Bar
>
>
>
> Ooo…this looks like an OO design pattern…surely wrong?
>
>
>
> > class Wibble a where
>
> >   visit :: (Foo -> b) -> (Bar -> b) -> a -> b
>
>
>
> > instance Wibble Foo where
>
> >   visit f _ x = f x
>
> > instance Wibble Bar where
>
> >   visit _ f x = f x
>
>
>
> I want a list of Wibbles....
>
> hmmm...
>
> (Wibble a) => [a] is clearly wrong...
>
> I want [(Wibble a) =>a]
>
>
>
> so I package it up?
>
>
>
> > data WibblePackage where
>
> >   WibblePackage :: (Wibble a) => a -> WibblePackage
>
>
>
> lets try this now…so pointless function across Wibbles in a list.
>
>
>
> > fizzBuzz :: [WibblePackage] -> Integer
>
> > fizzBuzz []       = 0
>
> > fizzBuzz ((WibblePackage x) : xs) = (visit (\_ -> 1) (\_ -> 2) x) +
> (fizzBuzz xs)
>
>
>
> > help :: Integer
>
> > help = fizzBuzz [WibblePackage Foo,WibblePackage Bar]
>
>
>
>
>
> That works!
>
>
>
> OO nerds will get uptight about “closing” the Wibble typeclass….but I’ve
> managed to create a list of different types and have a mechanism for
> recovering the type.
>
>
>
> How would a Haskell nerd do this? (I have looked, but they look more
> complicated….maybe to my OO eye).
>
>
>
>
>
>
>
> CONFIDENTIALITY NOTICE
>
> This e-mail (and any attached files) is confidential and protected by
> copyright (and other intellectual property rights). If you are not the
> intended recipient please e-mail the sender and then delete the email and
> any attached files immediately. Any further use or dissemination is
> prohibited.
>
> While MTV Networks Europe has taken steps to ensure that this email and
> any attachments are virus free, it is your responsibility to ensure that
> this message and any attachments are virus free and do not affect your
> systems / data.
>
> Communicating by email is not 100% secure and carries risks such as delay,
> data corruption, non-delivery, wrongful interception and unauthorised
> amendment. If you communicate with us by e-mail, you acknowledge and assume
> these risks, and you agree to take appropriate measures to minimise these
> risks when e-mailing us.
>
> MTV Networks International, MTV Networks UK & Ireland, Greenhouse,
> Nickelodeon Viacom Consumer Products, VBSi, Viacom Brand Solutions
> International, Be Viacom, Viacom International Media Networks and VIMN and
> Comedy Central are all trading names of MTV Networks Europe.  MTV Networks
> Europe is a partnership between MTV Networks Europe Inc. and Viacom
> Networks Europe Inc.  Address for service in Great Britain is 17-29 Hawley
> Crescent, London, NW1 8TT.
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
>
>


-- 
Chris Allen
Currently working on http://haskellbook.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20150619/ec84e79f/attachment.html>


More information about the Haskell-Cafe mailing list