
Hi,
On Thu, Jul 23, 2009 at 4:26 PM, Chaddaï Fouché
On Thu, Jul 23, 2009 at 10:18 PM, Chaddaï Fouché
wrote: Your instance would look like that :
Oops... I forgot to trim the extra parameters !
instance IPAddr IPv4Addr where type Host IPv4Addr = IPv4Host type Mask IPv4Addr = IPv4Mask host (IPv4Addr h _) = h mask (IPv4Addr _ m) = m
This is great stuff and exactly what I wanted. Thank you very much guys! I kept on hacking at it and so far I have this code: http://hpaste.org/fastcgi/hpaste.fcgi/view?id=7428 which unfortunately doesn't compile: Net/IP.hs:44:39: Couldn't match expected type `Word (Host a)' against inferred type `Word (Mask a)' In the second argument of `($)', namely `(bits h) .&. (bits m)' In the first argument of `makeIPAddr', namely `(fromBits $ (bits h) .&. (bits m))' In the first argument of `($)', namely `makeIPAddr (fromBits $ (bits h) .&. (bits m))' In the declaration of the class IPAddr, is there any way to force that the IPHost and IPMask types are made up from the same IPBits type? Basically I would like the compiler to enforce that Word (Host a) and Word (Mask a) be the same type for a specific instance of IPAddr. Note: I'm not sure how practical all this is going to be in the end (perhaps a bit to convoluted), but it's an excellent learning exercise for me. Thanks a lot, Patrick
One advantage compared to the multiparameter + functional dependencies solution is that you can write : (IPAddr a) => ... In your context rather than introducing h and m when they're not needed.
If you need to write "Host a" several time in a function, you can put the following in your context : (IPAdrr a, Host a ~ h) => ... and use h for Host a thereafter.
-- Jedaï
-- ===================== Patrick LeBoutillier Rosemère, Québec, Canada