Re: [Haskell-cafe] Is this the right way to do polymorphism?
On Fri, 7 Jan 2011, Daryoush Mehrtash wrote: -- | Performs a signed request with the available token. serviceRequest :: (HttpClient c,MonadIO m) = c - OAuthRequest - OAuthMonadT m Response serviceRequest c req = do { result - lift $ runClient c (unpackRq req) I do not see, why different download methods need distinct types at all (the instances of HttpClient). I would certainly just pass a dictionary of access methods around. ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
[Haskell-cafe] Is this the right way to do polymorphism?
I am trying to evaluate the polymorphism technique used in Hackage library. I like to know if the approach taken is right or not. The code in question is in the Hoaut package http://hackage.haskell.org/package/hoauth/ As far as I can understand the code wants to have polymorphism on HTTP client such that it can use different underlying HTTP. The package comes with Curl and Debug implementation of its HTTPClient class. My question is with how the polymorphism is used. In function such as serviceRequest in the Network.OAuth.Consumer module you have: -- | Performs a signed request with the available token. serviceRequest :: (HttpClient c,MonadIO m) = c - OAuthRequest - OAuthMonadT m Response serviceRequest c req = do { result - lift $ runClient c (unpackRq req) ; case (result) of Right rsp - return rsp Left err - fail $ Failure performing the request. [reason= ++ err ++] } The function expects the HTTPClient implementation to be the first argument to the function. Is that the right thing to do? Or should the instance of the client be a type parameter in the computation (in this case OAuthMonadT)? thanks, Daryoush ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] Is this the right way to do polymorphism?
If you always expect to be passing c as a parameter and never returned, it is probably better off as a data type. Eg. HTTPClient might look like a traditional OO class: class HTTPClient c where foo :: c - stuff bar :: c - stuff I've found that it is easier to work with if you use a data type instead: data HTTPClient = HTTPClient { foo :: stuff, bar :: stuff } But other than that, yeah that's about right. If you want a function to be polymorphic in something, take the something as a parameter. Simple as that. Luke On Fri, Jan 7, 2011 at 8:01 PM, Daryoush Mehrtash dmehrt...@gmail.com wrote: I am trying to evaluate the polymorphism technique used in Hackage library. I like to know if the approach taken is right or not. The code in question is in the Hoaut package http://hackage.haskell.org/package/hoauth/ As far as I can understand the code wants to have polymorphism on HTTP client such that it can use different underlying HTTP. The package comes with Curl and Debug implementation of its HTTPClient class. My question is with how the polymorphism is used. In function such as serviceRequest in the Network.OAuth.Consumer module you have: -- | Performs a signed request with the available token. serviceRequest :: (HttpClient c,MonadIO m) = c - OAuthRequest - OAuthMonadT m Response serviceRequest c req = do { result - lift $ runClient c (unpackRq req) ; case (result) of Right rsp - return rsp Left err - fail $ Failure performing the request. [reason= ++ err ++] } The function expects the HTTPClient implementation to be the first argument to the function. Is that the right thing to do? Or should the instance of the client be a type parameter in the computation (in this case OAuthMonadT)? thanks, Daryoush ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe