[RFC] Network.Socket: change get/setSocketOption
Bertram Felgenhauer
bertram.felgenhauer at googlemail.com
Sun Jun 25 09:08:20 EDT 2006
On 6/25/06, I wrote:
> What I'm proposing is to make SocketOption a proper ADT and change
> get- and setSocketOption to functions that take type constructors
> instead of tags as arguments, i.e.
>
> getSocketOption :: Socket -> (a -> SocketOption) -> IO a
> setSocketOption :: Socket -> (a -> SocketOption) -> a -> IO ()
It should be noted that while the patch defines an ADT, it does
sort of abuse it by providing an interface that uses the constructors
in a tag-like manner. I did this for two reasons, first, it saves a
bunch of code, and second, it mimics the old interface very closely.
Passing a non-constructor argument will lead to weird results, but
as far as I can see, nothing truly bad happens, no memory corruption
at least.
I could easily be persuaded to actually make the interface look like
this:
getSocketOption :: Socket -> SocketOption -> IO SocketOption
setSocketOption :: Socket -> SocketOption -> IO ()
(getSocketOption would fill in the value in SocketOption with the
actual value, that is the parameter would act as a template)
This increases safety, but it comes at a cost in code size (with
ugly #ifdefs), unless I'm missing something.
I'd like to avoid creating a second ADT for queries or separate
functions for each of the options.
Bertram
More information about the Libraries
mailing list