I want to write a function point-free in haskell, to keep things simple lets say I want to make this function:
maxmin :: Ord a => a -> a -> a -> a
maxmin a b c = max a (min b c)
I can improve this to
maxmin a b = (max a) . (min b)
but is there any way to get rid of a and b?
I wouldn't say this is simplier but here you go:
maxmin :: Ord a => a -> a -> a -> a
maxmin = (. min) . (.) . max
(Generated with pl
tool from lambdabot
http://www.haskell.org/haskellwiki/Pointfree)
lambdabot> pl maxmin a b c = max a (min b c)
maxmin = (. min) . (.) . max
You just use the "three laws of sections" for that,
(a `op` b) = (a `op`) b = (`op` b) a = op a b
so that
import Control.Arrow
maxmin a b = (max a) . (min b)
= (.) (max a) (min b)
= uncurry (.) (max a, min b)
= uncurry (.) . (max *** min) $ (a, b)
= curry (uncurry (.) . (max *** min)) a b
which is not too readable either. :)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With