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