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

Christopher Allen cma at bitemyapp.com
Fri Jun 19 16:12:14 UTC 2015


Sorry for adding to the dogpile, should've guessed others would point to
the same resource :)

On Fri, Jun 19, 2015 at 11:11 AM, Christopher Allen <cma at bitemyapp.com>
wrote:

> 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
>



-- 
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/8f6645c7/attachment.html>


More information about the Haskell-Cafe mailing list