Haskell Typeclass for Tuples

haskell, typeclass

Solution

A version with worse parametricity guarantees can be had with MPTCS and Fundeps or with TypeFamilies.

type family Fst p
type instance Fst (a,b) = a
type instance Fst (a,b,c) = a

...

class First p where
   fst :: p -> Fst p

instance Fst (a,b) where
   fst (a,_) = a

instance Fst (a,b,c) where
   fst (a,_,_) = a

...

but ultimately, you'll need to use some extensions.

Problem

I was playing around with typeclasses and made this: ``` class Firstable f where fst :: f a -> a class Secondable f where snd :: f a -> a ``` I then tried to add an implementation for `(,)` and realized that I could do: ``` instance Secondable ((,) a) where snd (x,y) = y ``` I'm pretty sure this works because `Secondable` should have kind `(* -> *)` where `((,) a)` has that type, however, I don't know how to implement `Firstable` for `((,) * a)` where `*` is the bound variable, In my interpretation I am trying to do the equivalent of: ``` instance Firstable (flip (,) a) where ... ``` Is there a way to do this in Haskell? Preferably without extensions?

Original source