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

Anupam Jain ajnsit at gmail.com
Fri Jun 19 16:03:49 UTC 2015


I discovered the same general pattern foroop

On Friday, June 19, 2015, 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.
>


-- 
Sent from my hyper-communicator
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20150619/95de26cf/attachment.html>


More information about the Haskell-Cafe mailing list