
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
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 ian@skybluetrades.net www.skybluetrades.net