haskelllambda-calculushlint

What does eta reduce mean in the context of HLint


I'm looking at the tutorial http://haskell.org/haskellwiki/How_to_write_a_Haskell_program

import System.Environment

main :: IO ()
main = getArgs >>= print . haqify . head

haqify s = "Haq! " ++ s

When running this program under HLint it gives the following error;

./Haq.hs:11:1: Warning: Eta reduce
Found:
  haqify s = "Haq! " ++ s
Why not:
  haqify = ("Haq! " ++ )

Can someone shed some light on what exactly "Eta Reduce" means in this context?


Solution

  • Eta reduction is turning \x -> f x into f as long as f doesn't have a free occurence of x.

    To check that they're the same, apply them to some value y:

    (\x -> f x) y === f' y -- (where f' is obtained from f by substituting all x's by y)
                  === f y  -- since f has no free occurrences of x
    

    Your definition of haqify is seen as \s -> "Haq! " ++ s, which is syntactic sugar for \s -> (++) "Haq! " s. That, in turn can be eta-reduced to (++) "Haq! ", or equivalently, using section notation for operators, ("Haq! " ++).