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?
You can use type families like so (A different take on what Edward wrote):
{-# LANGUAGE TypeFamilies #-}
class Firstable a where
type First a :: *
fst :: a -> First a
class Secondable a where
type Second a :: *
snd :: a -> Second a
instance Firstable (a,b) where
type First (a, b) = a
fst (x, _) = x
instance Secondable (a,b) where
type Second (a, b) = b
snd (_, y) = y
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With