
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/ ---