Hi, I am trying to create an overloaded function "à la Java" to be able to call it either with a string or a number. Ex : definePort "http" definePort 80 but I have problem with restrictions in Haskell's type system (or with my lack of experience with it). The program : data PolyType = MkPolyLeft String | MkPolyRight (String, String) | MkPolyNum Int deriving Show class Poly a where poly :: a -> PolyType instance Poly String where poly s = MkPolyLeft s instance Poly (String, String) where poly p = MkPolyRight p instance Poly Int where poly i = MkPolyNum i po :: (Poly a) => a -> PolyType po = poly tpo1, tpo2, tpo3 :: PolyType tpo1 = po "35" tpo2 = po ("36", "37") tpo3 = po 39 gives the following result with ghc (5.03 & -fglasgow-exts) : cl.hs:21: Ambiguous type variable(s) `a' in the constraint `Poly a' arising from use of `po' at cl.hs:21 In the definition of `tpo3': po 39 cl.hs:21: Ambiguous type variable(s) `a' in the constraint `Num a' arising from the literal `39' at cl.hs:21 In the first argument of `po', namely `39' In the definition of `tpo3': po 39 I think I need the "closed" extension of the 'class' clause to do that (but it does not seem to be implemented yet). Is there a better solution ? Thank you, Alain
The problem is that you might have: instance Poly Double where ... and then when you say: po 5 it doesn't know whether this is an Int or a Double. writing po (5::Int) should be sufficient. -- Hal Daume III "Computer science is no more about computers | hdaume@isi.edu than astronomy is about telescopes." -Dijkstra | www.isi.edu/~hdaume On Wed, 26 Jun 2002, Alain Cremieux wrote:
Hi, I am trying to create an overloaded function "� la Java" to be able to call it either with a string or a number. Ex : definePort "http" definePort 80 but I have problem with restrictions in Haskell's type system (or with my lack of experience with it).
The program :
data PolyType = MkPolyLeft String | MkPolyRight (String, String) | MkPolyNum Int deriving Show
class Poly a where poly :: a -> PolyType
instance Poly String where poly s = MkPolyLeft s instance Poly (String, String) where poly p = MkPolyRight p instance Poly Int where poly i = MkPolyNum i
po :: (Poly a) => a -> PolyType po = poly
tpo1, tpo2, tpo3 :: PolyType tpo1 = po "35" tpo2 = po ("36", "37") tpo3 = po 39
gives the following result with ghc (5.03 & -fglasgow-exts) :
cl.hs:21: Ambiguous type variable(s) `a' in the constraint `Poly a' arising from use of `po' at cl.hs:21 In the definition of `tpo3': po 39
cl.hs:21: Ambiguous type variable(s) `a' in the constraint `Num a' arising from the literal `39' at cl.hs:21 In the first argument of `po', namely `39' In the definition of `tpo3': po 39
I think I need the "closed" extension of the 'class' clause to do that (but it does not seem to be implemented yet).
Is there a better solution ? Thank you, Alain
_______________________________________________ Haskell mailing list Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell
Hi, I am trying to create an overloaded function "à la Java" to be able to call it either with a string or a number. Ex : definePort "http" definePort 80 but I have problem with restrictions in Haskell's type system
Is there a better solution ?
If we knew /why/ you wanted to do this we might be able to help. I can't see why you want to allow Strings, which have far too wide a range of values, as arguments to something that takes a port designator as an argument. data Port = Tcpmux | Nbp | Echo_ddp | Rje | Zip | Echo_tcp | ... deriving Enum, ... instance Num Port where ... would seem like a better way to me. Jón -- Jón Fairbairn Jon.Fairbairn@cl.cam.ac.uk 31 Chalmers Road jf@cl.cam.ac.uk Cambridge CB1 3SZ +44 1223 570179 (after 14:00 only, please!)
Jon Fairbairn <Jon.Fairbairn@cl.cam.ac.uk> writes:
data Port = Tcpmux | Nbp | Echo_ddp | Rje | Zip | Echo_tcp | ... deriving Enum, ... instance Num Port where ...
Or, alternatively, just use Strings, and have a portFromString first check /etc/services for a match, then try to parse the string as a positive integer, and finally generate an error if no valid port can be determined? -kzm -- If I haven't seen further, it is by standing in the footprints of giants
Jon Fairbairn <Jon.Fairbairn@cl.cam.ac.uk> writes:
data Port = Tcpmux | Nbp | Echo_ddp | Rje | Zip | Echo_tcp | ... deriving Enum, ... instance Num Port where ...
Or, alternatively, just use Strings, and have a portFromString first check /etc/services for a match, then try to parse the string as a positive integer, and finally generate an error if no valid port can be determined?
Possibly, if there's really no way of making sure the error happens at compile time. -- Jón Fairbairn Jon.Fairbairn@cl.cam.ac.uk 31 Chalmers Road jf@cl.cam.ac.uk Cambridge CB1 3SZ +44 1223 570179 (after 14:00 only, please!)
participants (4)
-
Alain Cremieux -
Hal Daume III -
Jon Fairbairn -
ketil@ii.uib.no