Bulat, Stefan, My question wasn't clear. I understand already that classes with associated types are are alternative to MPTC with fundeps. When using AT then we have to decide what part of the abstraction is the class and what part is the associated type. Sometimes this seams arbitrary. If we have: class A a where type B b f :: a -> B b instance A Int where type B = Bool f = (==0) Can't we also rewrite it as: class B b where type A a f :: A a -> b instance B Bool where type A = Int f = (==0) What is the practical difference between class A and class B? With class A we can define instances so that f is overloaded (Int -> Bool), (String -> Bool), (Bool -> Bool) by defining instances of A for Int, String, and Bool, but we cannot overload it more (Int -> String), (Int -> Int) because we can only have on "instance A Int". The converse is true for class B. Is that the only difference? If so, then why do we have "associated types" instance of "associated classes" like this?: class A a where class B b where f :: a -> b instance A Int where instance B Bool where f = (==0) The made-up syntax I presented in my previous message was just a different way of writing the above (which is also made-up syntax): class A a, B b where f :: a -> b instance A Int, B Bool where f = (==0) class Elem elem, Collect collect where empty :: collect insert :: elem -> collect -> collect toList :: collect -> [elem] Thanks for your help, Brian On 9/1/06, Bulat Ziganshin <bulat.ziganshin@gmail.com> wrote:
Hello Brian,
Friday, September 1, 2006, 8:32:55 PM, you wrote:
I read the easy parts of the "Associated Types with Class" and "Associated Type Synonyms" papers. An associated type synonym seems to kind of work similarly to a restricted form of class. In what way are the two following examples different?
-- define a class with a type synonym, and a set of operations class A a where type B b foo :: a -> B b
instance A Int where type B = Bool foo = (==0)
-- define two classes, and an function that . class A a, B b where foo :: a -> b
instance A Int, B Bool where foo = (==0)
where you've find such unusual syntax? :) GHC/Hugs supports multi-parameter type classes (MPTC):
class AB a b where foo :: a -> b
instance AB Int Bool where foo = (==0)
AT replaces MPTC with FD (functional dependency), which allows to specify which type parameter of MPTC is detremined by another one, i.e.:
class AB a b | a->b where ....
for further details about MPTC+FD see chapter 7.1.1 in the http://cvs.haskell.org/Hugs/pages/hugsman/exts.html
Also, has anybody written a paper on the differences between typeclasses + associated types and ML's module system + overloading?
"ML Modules and Haskell Type Classes: A Constructive Comparison"
http://www.informatik.uni-freiburg.de/~wehr/diplom/Wehr_ML_modules_and_Haske...
-- Best regards, Bulat mailto:Bulat.Ziganshin@gmail.com