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?
TypeSynonymInstances, but type synonyms cannot be partially evaluated. But are you aware of the alternative withMultiParamTypeClasses? That's perhaps a bit ugly, but it works. - leftaroundabout