[Haskell-cafe] sections for record settors

Tim Newsham newsham at lava.net
Tue Sep 19 17:28:47 EDT 2006

    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

More information about the Haskell-Cafe mailing list