Hi,
   When you create a record in haskell, it automatically generates
gettor functions for accessing the record fields.  It also provides
you with a record update syntax:

    rec {field=val}

but there is no settor function.  It would be nice if there was some
sort of section-like syntax to access the settor function, like:

    {field=} -- val rec
    {field=val} -- rec

or even if there was a name for that function (such as field_settor).
Without such a syntax, one often has to write lambdas like:

    \r v -> r {field=v}
    \r -> r {field=3}

Consider for example an cmd line parser that collects flags in
a record.  Instead of writing:

    opt "l" (NoArg  {c_loop=False})        "dont loop",
    opt "o" (optStr {c_out=} "dir")        "output dir",
    opt "t" (optInt {c_maxtime=} "mins")   "maximum time"

we would have to write it out as:

options = [
    opt "l" (NoArg  (\c   -> c {c_loop=False}))         "dont loop",
    opt "o" (optStr (\v c -> c {c_out=v}) "dir")        "output dir",
    opt "t" (optInt (\v c -> c {c_maxtime=v}) "mins")   "maximum time"
    ] where
        opt cs d s = Option cs [] d s
        optStr f name = ReqArg f name
        optInt f name = ReqArg (f . read) name

getOptions :: String -> [String] -> IO Config
getOptions prog argv =
    let header = "Usage:  " ++ prog ++ " [OPTIONS...] files..." in
let usage s = ioError (userError (s ++ "\n" ++ usageInfo header options)) in
    let (updates, files, errs) = getOpt2 options argv in
    let config = updates defConfig {c_files=files} in
    case () of
      _ | not (null errs)           -> usage (concat errs)
        | null (c_files config)     -> usage "no files specified"
        | otherwise                 -> return config


Tim Newsham
http://www.thenewsh.com/~newsham/
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to