
Greetings, I have been reading about how to use system.console.getOpt, specifically "Interpreting flags as transformations of an options record" which can be found at http://www.haskell.org/ghc/docs/latest/html/libraries/base/System-Console-Ge... Line 3 of compilerOpts argv = case getOpt Permute options argv of (o,n,[] ) -> return (foldl (flip id) defaultOptions o, n) (_,_,errs) -> ioError (userError (concat errs ++ usageInfo header options)) where header = "Usage: ic [OPTION...] files..." uses (flip id) to resolve a list of functions down to a single record. Looking at the type of flip$id I can see why it works in this context. I just don't understand how passing id to flip results in the following type signature: Prelude> :t flip$id flip$id :: b -> (b -> c) -> c I do understand what flip has done to map here:- Prelude> :t flip$map flip$map :: [a] -> (a -> b) -> [b] map take a function and a list and produces a new list. If map is passed to flip the result is a function that takes a list, then a function and results in a new list. How do we go from flip having this signature: Prelude> :t flip flip :: (a -> b -> c) -> b -> a -> c Prelude> and id having Prelude> :t id id :: a -> a Prelude> to flip$id looking like flip$id :: b -> (b -> c) -> c ??? Thanks, Jeff