
Carsten Schultz wrote:
Wouldn't that make getSocketOption :: Socket -> SocketOption -> IO Int a bit strange? How would you propose to change it?
Possible, but also possibly overkill, would be:
newtype Debug = Debug Bool newtype SendBuffer = SendBuffer (Maybe Int) [...]
class SocketOption a where [...]
instance SocketOption Debug [...] instance SocketOption SendBuffer [...] [...]
setSocketOption :: SocketOption a => Socket -> a -> IO () getSocketOption :: SockerOption a => Socket -> IO a
However, while quite clever :-), this would not be far from having a seperate get/set-functions for every option (and could indeed be implemented that way).
This is a recurring problem and has been solved several times e.g. in some Haskell GUI bindings and my OpenGL/GLUT binding, see e.g.: http://haskell.org/HOpenGL/newAPI/OpenGL/Graphics.Rendering.OpenGL.GL.StateV... If we had: socketOptionDebug :: Socket -> StateVar Bool socketOptionSendBuffer :: Socket -> StateVar (Maybe Int) ... then we could write: socketOptionDebug mySocket $= True maybeBuf <- get $ socketOptionSendBuffer mySocket ... But there are some reasons for not using this here: * Alas, HasGetter/HasSetter/StateVar/... are not standard. * It's a bit overkill for the simple task at hand. :-) I would simply go for a single setter function and several getters here. Cheers, S.