
Hi all, I have used GetOpt in Python and Ocaml so I am reasonably familiar with it, and I have been studying the technique here: http://www.haskell.org/haskellwiki/High-level_option_handling_with_GetOpt Can anyone explain to me what is actually happening here: opts <- foldl (>>=) (return startOptions) actions let Options { optVerbose = verbose , optInput = input , optOutput = output } = opts input >>= output I understand the fold is evaluating everything in the actions list overlaying them onto the startOptions record, then getting these out of IO and into the opts record - but where are "verbose", "input" and "output" coming from? Are they just aliases? Any insight gratefully received :-) Thanks, G

On 05/08/10 20:18, Gaius Hammond wrote:
Hi all,
I have used GetOpt in Python and Ocaml so I am reasonably familiar with it, and I have been studying the technique here:
http://www.haskell.org/haskellwiki/High-level_option_handling_with_GetOpt
Can anyone explain to me what is actually happening here:
opts <- foldl (>>=) (return startOptions) actions
let Options { optVerbose = verbose , optInput = input , optOutput = output } = opts input >>= output
I understand the fold is evaluating everything in the actions list overlaying them onto the startOptions record, then getting these out of IO and into the opts record - but where are "verbose", "input" and "output" coming from? Are they just aliases?
It's an example of pattern matching, it "picks apart" 'opts'. So, yes, they are aliases for the values of the "members" of 'opts'. /M

input, output and verbose are bindings introduced by pattern matching within the let clause. The Options datatype has field labels optVerbose, optInput and optOutput: data Options = Options { optVerbose :: Bool , optInput :: IO String , optOutput :: String -> IO () } Pattern matching can elide field labels, this let binding is equivalent: let (Options verbose input output) = opts
participants (3)
-
Gaius Hammond
-
Magnus Therning
-
Stephen Tetley