[Haskell-cafe] classes with types which are wrapped in

2010-01-22 Thread Andrew U. Frank
i encounter often a problem when i have a class with some operations (say 
class X with push)  applied to a type A b. I then wrap A in a type A_sup, with 
some more type parameters and i cannot write a instance of class A_sup because 
i have a kind mismatch. any suggestions? (reordering of the type parameters of 
A_sup is not a solution, because another class operates on this parameter) 

here a simplistic case (i know that A could be reduced to [], my real cases 
are more complicated).

data A b = A b [b]

data Asup x ab y = Asup x ab y

class X a b where
push :: b - a b - a b

instance X A Int where
push b' (A b bs) = A b' (b:bs)

instance X Asup Char Int Float where
push b' (Asup a b c) = Asup a (push b' b) c

-- this does not compile because the number of type arguments for X is wrong.

if i try with a type

type A_2 b = Asup Char (A b) Float

instance X A_2 Int where
push b' (Asup a b c) = Asup a (push b' b) c

(and --TypeSynonymInstances) i get:

Type synonym `A_2' should have 1 argument, but has been given 0
In the instance declaration for `X A_2 Int'

what is the solution? thank you!
andrew
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] classes with types which are wrapped in

2010-01-22 Thread Miguel Mitrofanov

Wrap it in a newtype. That's the only way I know.

Andrew U. Frank wrote:
i encounter often a problem when i have a class with some operations (say 
class X with push)  applied to a type A b. I then wrap A in a type A_sup, with 
some more type parameters and i cannot write a instance of class A_sup because 
i have a kind mismatch. any suggestions? (reordering of the type parameters of 
A_sup is not a solution, because another class operates on this parameter) 

here a simplistic case (i know that A could be reduced to [], my real cases 
are more complicated).


data A b = A b [b]

data Asup x ab y = Asup x ab y

class X a b where
push :: b - a b - a b

instance X A Int where
push b' (A b bs) = A b' (b:bs)

instance X Asup Char Int Float where
push b' (Asup a b c) = Asup a (push b' b) c

-- this does not compile because the number of type arguments for X is wrong.

if i try with a type

type A_2 b = Asup Char (A b) Float

instance X A_2 Int where
push b' (Asup a b c) = Asup a (push b' b) c

(and --TypeSynonymInstances) i get:

Type synonym `A_2' should have 1 argument, but has been given 0
In the instance declaration for `X A_2 Int'

what is the solution? thank you!
andrew
___
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


Re: [Haskell-cafe] classes with types which are wrapped in

2010-01-22 Thread Reid Barton
On Fri, Jan 22, 2010 at 05:08:15PM +0100, Andrew U. Frank wrote:
 i encounter often a problem when i have a class with some operations (say 
 class X with push)  applied to a type A b. I then wrap A in a type A_sup, 
 with 
 some more type parameters and i cannot write a instance of class A_sup 
 because 
 i have a kind mismatch. any suggestions? (reordering of the type parameters 
 of 
 A_sup is not a solution, because another class operates on this parameter) 
 
 here a simplistic case (i know that A could be reduced to [], my real cases 
 are more complicated).
 
 data A b = A b [b]
 
 data Asup x ab y = Asup x ab y
 
 class X a b where
 push :: b - a b - a b

This is a little strange.  Are you sure you don't want either

class X a where
push :: b - a b - a b

or

class X a b where
push :: b - a - a

?  The second one might help you with your subsequent problem
(although I didn't understand quite what you were trying to do there).

Regards,
Reid Barton
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] classes with types which are wrapped in

2010-01-22 Thread Steffen Schuldenzucker

Hi Andrew,

Andrew U. Frank wrote:
here a simplistic case (i know that A could be reduced to [], my real cases 
are more complicated).


data A b = A b [b]

data Asup x ab y = Asup x ab y

class X a b where
push :: b - a b - a b

instance X A Int where
push b' (A b bs) = A b' (b:bs)

instance X Asup Char Int Float where
push b' (Asup a b c) = Asup a (push b' b) c

  
If I understand you correctly, what you want here are type level 
lambdas. Abusing notation:


instance X (\t - Asup Char t Float) Int where
   push b' (Asup a b c) = Asup a (push b' b) c

However, type level lambdas introduce lots of ambiguities and are 
therefore AFAIK not supported in haskell[1].



if i try with a type

type A_2 b = Asup Char (A b) Float

instance X A_2 Int where
push b' (Asup a b c) = Asup a (push b' b) c

(and --TypeSynonymInstances) i get:

Type synonym `A_2' should have 1 argument, but has been given 0
In the instance declaration for `X A_2 Int'
  
However, this error message looks strange. I tried to reduce this to a 
simpler case[1] and got the same message.
Does anyone know why it complains just about the number of type 
arguments (which is correct) ?


-- Steffen

[1] http://www.mail-archive.com/haskell-cafe@haskell.org/msg69579.html
[2] http://ideone.com/9BAj7MG7
(note that ideone is using ghc-6.8)

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] classes with types which are wrapped in

2010-01-22 Thread Daniel Fischer
Am Freitag 22 Januar 2010 17:08:15 schrieb Andrew U. Frank:
 i encounter often a problem when i have a class with some operations
 (say class X with push)  applied to a type A b. I then wrap A in a type
 A_sup, with some more type parameters and i cannot write a instance of
 class A_sup because i have a kind mismatch. any suggestions? (reordering
 of the type parameters of A_sup is not a solution, because another class
 operates on this parameter)

 here a simplistic case (i know that A could be reduced to [], my real
 cases are more complicated).

 data A b = A b [b]

 data Asup x ab y = Asup x ab y

That doesn't match its use below, perhaps 

data Asup x ab y = Asup x (A ab) y

(matches better with A_2)
or use Asup Char (A Int) Float below?


 class X a b where
 push :: b - a b - a b

How about type families?

class Y a where
type Pushy a :: *
push :: Pushy a - a - a

instance Y (A Int) where
type Pushy (A Int) = Int
push b' (A b bs) = A b' (b:bs)

instance Y (Asup Char (A Int) Float) where
type Pushy (Asup Char (A Int) Float) = Int
push b' (Asup a b c) = Asup a (push b' b) c


 instance X A Int where
 push b' (A b bs) = A b' (b:bs)

 instance X Asup Char Int Float where
 push b' (Asup a b c) = Asup a (push b' b) c

Missing instance X Int Int, but Int has wrong kind for that :)


 -- this does not compile because the number of type arguments for X is
 wrong.

 if i try with a type

 type A_2 b = Asup Char (A b) Float

 instance X A_2 Int where
 push b' (Asup a b c) = Asup a (push b' b) c

 (and --TypeSynonymInstances) i get:

 Type synonym `A_2' should have 1 argument, but has been given 0
 In the instance declaration for `X A_2 Int'

 what is the solution? thank you!
 andrew

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe