Well, they act like interfaces in argument types, just not variable or return types.
Yours, Alexey Romanov On Tue, Oct 14, 2008 at 4:11 PM, John Lato <[EMAIL PROTECTED]> wrote: > I was just thinking about what I wish someone had told me when I > started working with Haskell (not that long ago). It would have saved > me a great deal of trouble. > > The Difference Between Interfaces and Type Classes. > > Many "Introduction to Haskell for the OOper" style tutorials claim > that type classes are like Interfaces (for languages with that > feature). I now think that, although this is technically true, it's > fundamentally misleading. Here's a simple example demonstrating my > line of thought: > > In C# (and presumably Java), this sort of function is common: > public IList GetListOfData() > > In Haskell, a similar function may be > GetListOfData :: (Foldable a, Indexable a) => IO a > > In C#, it doesn't matter what the actual type returned by > GetListOfData is, as long is it supports the IList interface. It's > not uncommon for GetListOfData to make a choice between several > different implementations, depending on the nature of the data to be > returned. The following code is perfectly reasonable in C# : > > // List and MyList are different classes > if (something) { return new List(); } > else { return new MyList(); } > > The equivalent won't compile in Haskell, because the actual return > type does matter, and *is determined by the calling code*. Our > fictional GetListOfData can't return a List or a Mylist depending on > some conditional, in fact it can't explicitly return either one at > all, because the actual type of the result, as determined by the > caller, could be either one, or something else entirely (ignoring the > IO bit for the time being). > > So I've come to the conclusion that stating type classes are like > interfaces is misleading to newcomers to Haskell, because it leads > people to think they should use type classes for the same sorts of > problems OO-languages solve with interfaces. In turn this means new > programmers are encouraged to use OO-style architecture in programs, > reassured that they're in a "functional" idiom because they're using > the "functionally-approved" feature of type classes. I think that if > I had understood this earlier, I would have embraced functional idioms > more quickly. > > Incidentally, I'm still horrible at designing functional APIs and > modules, but at least now I know it, and I'm no longer trying to force > OO interfaces into Haskell. So I've made progress. > _______________________________________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe > _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe