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

Anupam Jain ajnsit at gmail.com
Fri Jun 19 16:05:50 UTC 2015


Doh fat fingers!

I discovered the same general pattern for oops programming in Haskell. An
example -
https://github.com/ajnsit/oop-inheritence-in-haskell/blob/master/Main.hs

On Friday, June 19, 2015, Anupam Jain <ajnsit at gmail.com> wrote:

> I discovered the same general pattern foroop
>
> On Friday, June 19, 2015, Nicholls, Mark <nicholls.mark at vimn.com
> <javascript:_e(%7B%7D,'cvml','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
>


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


More information about the Haskell-Cafe mailing list