"Neil Mitchell" <[EMAIL PROTECTED]> writes:

> > To make things concrete, the example I'm really thinking of is a "send
> > an email" function, which would take a subject, a body, a list of
> > recipients, optional lists of cc and bcc recipients, an optional
> > mailserver (default localhost), an optional port (default 25), and
> > possibly optional authentication details.
> 
> Records are your friend.
> 
> data Email = Email {subject :: String, body :: String, to ::
> [Address], cc = [Address], bcc = [Address], mailserver :: String, port
> :: Int}
> 
> defaultEmail = Email{subject = "No subject", body = "", to = [], cc =
> [], bcc = [], mailserver = "localhost", port = 25}
> 
> The user can then go:
> 
> sendEmail defaultEmail{subject="Subject here", body = "body here", to
> = ["haskell-cafe"], mailserver = "server.haskell.org"}
> 
> Now things which are't specified (port) keep their default value.

If you do this for more than one function (and consequently
more than one datatype) there's a case for a class --
something like:

class Defaultable t where
      defaults:: t

instance Defaultable Email where
      defaults =  Email{subject = "No subject", body = "", to = [],
                        cc = [], bcc = [], mailserver = "localhost", port = 25}

which would save having a defaultFoo for every Foo (at the
possible expense of occasional explicit types).

-- 
Jón Fairbairn                                 [EMAIL PROTECTED]


_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to