Hi, as for the nomenclature - mathematically the pattern
f^{-1} . g . f is sometimes called "conjugation" [1]. One (trivial) type of occurrence is data Foo a = Foo { unFoo :: a } deriving Show instance Functor Foo where fmap f = Foo . f . unFoo The under function from the lens library [2] allows expressing this as follows: instance Functor Foo where fmap = under (iso Foo unFoo) which is a very elegant way of capturing the essence of the pattern. Best regards, Nikita [1] http://en.wikipedia.org/wiki/Conjugacy_class [2] http://hackage.haskell.org/packages/archive/lens/3.9.0.2/doc/html/Control-Lens-Iso.html#v:under On 17/08/13 22:57, Dan Burton wrote: > The lens docs even have an example of another helper function, > "involuted" for functions which are their own inverse. > > >>> "live" & involuted reverse %~ ('d':) > "lived" > > inv f g = involuted f %~ g > > http://hackage.haskell.org/packages/archive/lens/3.9.0.2/doc/html/Control-Lens-Iso.html#v:involuted > > -- Dan Burton > > > On Sat, Aug 17, 2013 at 1:43 PM, Dan Burton <danburton.em...@gmail.com > <mailto:danburton.em...@gmail.com>> wrote: > > This is indeed a job for lens, particularly, the Iso type, and the > "under" function. Lens conveniently comes with a typeclassed > isomorphism called "reversed", which of course has a list instance. > > >>> under reversed (take 10) ['a'.. 'z'] > "qrstuvwxyz" > > -- Dan Burton > > On Aug 17, 2013 10:23 AM, "Anton Nikishaev" <m...@lelf.lu > <mailto:m...@lelf.lu>> wrote: > > Christopher Done <chrisd...@gmail.com > <mailto:chrisd...@gmail.com>> writes: > > > Anyone ever needed this? Me and John Wiegley were discussing > a decent > > name for it, John suggested inv as in involution. E.g. > > > > inv reverse (take 10) > > inv reverse (dropWhile isDigit) > > trim = inv reverse (dropWhile isSpace) . dropWhile isSpace > > > > That seems to be the only use-case I've ever come across. > > And it's here only because reverse^-1 ≡ reverse, is not it? > I only can see how f ∘ g ∘ f^-1 can be a pattern. > > > There's also this one: > > > > co f g = f g . g > > > > which means you can write > > > > trim = co (inv reverse) (dropWhile isSpace) > > > > but that's optimizing an ever rarer use-case. > > > -- > lelf > > > > _______________________________________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org <mailto:Haskell-Cafe@haskell.org> > http://www.haskell.org/mailman/listinfo/haskell-cafe > > > > > _______________________________________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe