Larry,

By your definition

f x = x

this function returns whatever it got in it's argument, thus:
1. compiler infers that it's argument is of type String from class-definition
2. String is actually a type-synonim for list of chars
   
        type String = [Char]

3. So now, on one hand function is returning something of a concrete type [Char], and on the other (from class-definition) it should be some type only restricted by operations on type-class.

Regarding your question on "how to do things properly" -- I'm not sure what exactly are you trying to achieve. Could you describe a problem you're trying to solve?

If you want to return something of type b, which is only constrainted by being an instance of a type-class A, then you need to create it with a function defined in class A. But since only function is f, it's not enough. Here's an example of solution for the original "return something of another instance" problem:

{-# LANGUAGE FlexibleInstances    #-}
{-# LANGUAGE TypeSynonymInstances #-}

class A a where
  f :: A b => a -> b
  def :: a

instance A Int where
  f x = def
  def = 4

instance A String where
  f x = def
  def = "asd"

main :: IO ()
main = print $ (f "asd" :: Int)

Cheers.

On Tue, Nov 11, 2014 at 10:59 PM, Larry Lee <llee454@gmail.com> wrote:
Hi

I have a very simple problem.
I have a class and want to define a function in that class that returns a different instance of the same class.

I tried accomplishing this as follows:

    class A a where
      f :: A b => a -> b


This fails however when I try to instantiate it. For example:

    instance A String where
      f x = x


I get an error message that makes absolutely no sense to me:

    src/CSVTree.hs:12:9:
        Could not deduce (b ~ [Char])
        from the context (A b)
          bound by the type signature for f :: A b => String -> b
          at src/CSVTree.hs:12:3-9
          `b' is a rigid type variable bound by
              the type signature for f :: A b => String -> b
              at src/CSVTree.hs:12:3
        In the expression: x
        In an equation for `f': f x = x
        In the instance declaration for `A String'
    make: *** [compile] Error 1

Can someone please explain: how I can achieve my goal; and why my code is failing; simply and in plain English.

Thanks,
Larry
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe