classes with types which are wrapped in

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

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

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

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)

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
participants (5)
-
Andrew U. Frank
-
Daniel Fischer
-
Miguel Mitrofanov
-
Reid Barton
-
Steffen Schuldenzucker