[Haskell-beginners] deducing type of multi-parameter type class

Michael Snoyman michael at snoyman.com
Thu Jul 15 02:13:34 EDT 2010


I think what you're looking for is functional dependencies. Basically, the
way you have the typeclass set up right now, "fn $ MyInt 5" could in theory
turn into anything; if you wanted, you could declare an "instance MyClass
MyInt Double" or anything else. You would like the compiler to be able to
automatically determine the output type. Using functional dependencies:

class Show b => MyClass a b | a -> b where

You could also use type families for this, but I believe you cannot express
the "Show" superclass:

class MyClass a where
    type MyResult a
    fn :: a -> MyResult a
instance MyClass MyInt where
    type MyResult MyInt = MyString
    fn (MyInt i) = MyString (show i)

Michael

On Thu, Jul 15, 2010 at 8:59 AM, Alex <a.p.katovsky at googlemail.com> wrote:

>  Hi,
>
> I'm trying to get the following code to compile:
>
> =======  Main.hs ==========
>
> import IO
>
> data MyInt = MyInt Int
> data MyString = MyString String deriving Show
>
> class Show b => MyClass a b where
>     fn :: a -> b
>
> instance MyClass MyInt MyString where
>     fn (MyInt i) = MyString (show i)
>
> myprint :: (MyClass a b) => a -> IO ()
> myprint a = putStrLn $ show (fn a)
>
> main = myprint 3
>
> =======  Main.hs ==========
>
> with ghc Main.hs -XMultiParamTypeClasses. However, the compiler cannot
> deduce the type of the b type variable (which in this case is MyString).
> How can I explicitly tell this information to the compiler?
>
> Many thanks,
> Alex.
>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/beginners/attachments/20100715/a85c902b/attachment.html


More information about the Beginners mailing list