Dinko Tenev wrote:

*Main> :type new
new :: (New a b) => a -> b

The type of new probably accounts for the difference (even though it
still makes me wonder what the big deal is :)

The big deal is to export just abstract types. When exporting abstract types one needs functions to create them, e.g. fromList, singleton, ..., and therefore one needs names for the creating functions. In realistic situations this solution tends to produce a number of similiar named functions. (One for every possible input.) Exactly this is captured by the class New, since all this functions have the same name now.

Using functional dependencies seems to fix it, i.e.:

Yes of course, but

class New a b | a -> b where new :: a -> b

No, I want to be able to define

instance a b
instance a c
...

   or, perhaps more appropriately:

class New a b | b -> a where new :: a -> b

No again, I want to be able to define

instance b a
instance c a
...

I re-ask my question:

{-# OPTIONS -fglasgow-exts #-}

import Data.Map

class New a b where new :: a -> b

instance Ord a => New [(a,b)] (Map a b) where new = fromList

>>f :: Ord a => [a] -> Map a Int
>>f xs = fromList $ zip xs [0..]
>>
g :: Ord a => [a] -> Map a Int
g xs = new $ zip xs [0..]

Why is ghc unable the determine the type of the Literal 0 in the definition of g? The definition of f works fine instead.

Regards,

--
-- Mirko Rahn -- Tel +49-721 608 7504 --
--- http://liinwww.ira.uka.de/~rahn/ ---
_______________________________________________
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to