Hello Ryan.. On Mon, Oct 13, 2008 at 3:33 PM, Ryan Ingram <[EMAIL PROTECTED]> wrote:
> Step 1: Forget everything you know about OO classes, then try again :) you seem to have read my mind [:)].. i actaually hit upon this issue while trying to "transcode" some C++ to Haskell.. > > > 2008/10/13 Arun Suresh <[EMAIL PROTECTED]>: > > class Foo a where > > fooFunc :: a -> Int > > > > data FooData = FData > > > > instance Foo FooData where > > fooFunc _ = 10 > > So far so good. > > > class Bar a where > > barFunc :: (Foo b) => a -> b -> Int > > So now, barFunc advertises "for any type a which is in the Bar > typeclass, and any type b which is in the Foo typeclass, I can give > you a function from a to b to Int". You can make an implementation of > this that has different functionality based on "a", but it needs to be > polymorphic in "b", taking any type "b" which is a member of Foo. > > > data BarData = BData > > > > instance Bar BarData where > > barFunc _ FData = 20 > > Uh oh! FData is of type FooData! But we just advertised that we > could take *anything* which is in the typeclass Foo, which can include > any number of other types. It doesn't matter that FooData is the only > declared member at this point. What that means is that if you want to > do anything with the second argument, you can only use functions that > accept any type which is a member of the Foo class. Right now that > just means generically polymorphic functions (id, const, etc.), and > the fooFunc function inside the "Foo" typeclass. > > For example, this declaration would work: > > instance Bar BarData where > barFunc _ f = 10 + fooFunc f > > > When I compile I get this : > > Couldn't match expected type `b' against inferred type `FooData' > > `b' is a rigid type variable bound by > > the type signature for `barFunc' at Sample.hs:16:20 > > In the pattern: FData > > In the definition of `barFunc': barFunc _ FData = 20 > > In the definition for method `barFunc' > > The compiler is just telling you what I just told you: barFunc says > that it should take any type "b", but the pattern FData constrains the > argument to be a FooData. > > > Think Im missing something really big... > > Could somebody kindly help me out here... > > I recommend reading http://www.haskell.org/haskellwiki/OOP_vs_type_classes Thanks... Arun > > -- ryan >
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe