Applying multiple functions to the same value point-free style in Haskell

Others have already posted how you can do this using the Reader monad, but that’s not the only way. It turns out that your second function is pretty close. I think you meant to post

foobar' x = (`map` [id, reverse]) ($ x)

Since the x is already near a rightmost position, you’re almost there. First, transform the section ($ x) into a function, because it’s a bit easier to work with:

-- by the definition of a right operator section
foobar'2 x = (`map` [id, reverse]) (\y -> ($) y x)

Next remove the x from the lambda body by bringing a new variable into scope, and applying the function to x

-- lambda abstraction I think...
foobar'2 x = (`map` [id, reverse]) $ (\z y -> ($) y z) x

Rewrite this application as a function composition, and then you can eta reduce:

-- by definition of '.'
foobar'3 x = (`map` [id, reverse]) . (\z y -> ($) y z) $ x

-- eta reduction
foobar'4 = (`map` [id, reverse]) . (\z y -> ($) y z)

Finally, notice that we can replace the lambda with a function

-- by definition of `flip`
foobar'5 = (`map` [id,reverse]) . flip ($)

and you have a point-free form.

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)