Re: [Haskell-cafe] inv f g = f . g . f
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
[Haskell-cafe] inv f g = f . g . f
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. 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. ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] inv f g = f . g . f
On 17 August 2013 19:11, Christopher Done chrisd...@gmail.com wrote: Anyone ever needed this? Me and John Wiegley were discussing a decent name for it, John suggested inv as in involution. E.g. In terms of a decent name: as soon as I saw the subject, I thought you were somehow inverting a function :/ In terms of how useful it is, I don't think I tend to use such an idiom. 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. 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. ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe -- Ivan Lazar Miljenovic ivan.miljeno...@gmail.com http://IvanMiljenovic.wordpress.com ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] inv f g = f . g . f
On 17/08/13 10:11, Christopher Done wrote: Anyone ever needed this? Me and John Wiegley were discussing a decent name for it, John suggested inv as in involution. E.g. First thing I thought was ‘inverse’… 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. I do this a lot as well. Why not skip the ‘g’ all together and have ‘f . reverse . f’ if that's all we're doing? You could even call it fromEnd at that point and we end up with a rather intuitive ‘fromEnd (drop 10)’. Maybe even just have an operator. 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. Is this a proposal for addition to something or is it just general discussion? -- Mateusz K. 0x2ADA9A97.asc Description: application/pgp-keys ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] inv f g = f . g . f
In J (a sort of dialect of APL), there's a thing called under, written .. The expression (f . g) x is equivalent to (g^:_1) (f (g x)) where g^:_1 is J's obverse of g, which in cases where it exists is usually the inverse of g ( http://www.jsoftware.com/help/dictionary/intro26.htm). Abusing notation with some weird mixture of Haskell and J, this means that ((+) . log) multiplies numbers by taking logs, adding and exponentiating. You inv is under for cases where g == g^-1 (reverse being a good example). In cases where g /= g^-1, it's obviously a useful operation, but the case where g == g^-1 seems a bit specialised. Can you think of any other useful cases than g == reverse? I guess inv (1/) sum is the harmonic mean, but that's another special case. On 17 August 2013 11:40, Mateusz Kowalczyk fuuze...@fuuzetsu.co.uk wrote: On 17/08/13 10:11, Christopher Done wrote: Anyone ever needed this? Me and John Wiegley were discussing a decent name for it, John suggested inv as in involution. E.g. First thing I thought was ‘inverse’… 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. I do this a lot as well. Why not skip the ‘g’ all together and have ‘f . reverse . f’ if that's all we're doing? You could even call it fromEnd at that point and we end up with a rather intuitive ‘fromEnd (drop 10)’. Maybe even just have an operator. 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. Is this a proposal for addition to something or is it just general discussion? -- Mateusz K. ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe -- Ian Ross Tel: +43(0)6804451378 i...@skybluetrades.net www.skybluetrades.net ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] inv f g = f . g . f
On Sat, Aug 17, 2013 at 11:11:07AM +0200, Christopher Done wrote: 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 This sounds like a job for a lens, or similar. Tom ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] inv f g = f . g . f
Note that at least for the dropWhile example, there is a specialized function, dropWhileEnd, which is most likely more efficient than reversing the list twice. On Aug 17, 2013 3:35 PM, Tom Ellis tom-lists-haskell-cafe-2...@jaguarpaw.co.uk wrote: On Sat, Aug 17, 2013 at 11:11:07AM +0200, Christopher Done wrote: 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 This sounds like a job for a lens, or similar. Tom ___ Haskell-Cafe mailing list 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
Re: [Haskell-cafe] inv f g = f . g . f
Hi, Am Samstag, den 17.08.2013, 11:11 +0200 schrieb Christopher Done: inv reverse (take 10) if you want that fast and lazy, check out http://www.joachim-breitner.de/blog/archives/600-On-taking-the-last-n-elements-of-a-list.html Greetings, Joachim -- Joachim “nomeata” Breitner m...@joachim-breitner.de • http://www.joachim-breitner.de/ Jabber: nome...@joachim-breitner.de • GPG-Key: 0x4743206C Debian Developer: nome...@debian.org signature.asc Description: This is a digitally signed message part ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] inv f g = f . g . f
Christopher Done 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 http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] inv f g = f . g . f
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 wrote: Christopher Done 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 http://www.haskell.org/mailman/listinfo/haskell-cafe ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] inv f g = f . g . f
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.comwrote: 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 wrote: Christopher Done 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 http://www.haskell.org/mailman/listinfo/haskell-cafe ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] inv f g = f . g . f
Dan Burton danburton.em...@gmail.com writes: under reversed (take 10) ['a'.. 'z'] qrstuvwxyz Excellent, thanks! -- John Wiegley FP Complete Haskell tools, training and consulting http://fpcomplete.com johnw on #haskell/irc.freenode.net ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe