Класс типов Haskell для кортежей

Я играл с классами типов и сделал это:

class Firstable f where
  fst :: f a -> a

class Secondable f where
  snd :: f a -> a

Затем я попытался добавить реализацию для (,) и понял, что могу сделать:

instance Secondable ((,) a) where
  snd (x,y) = y

Я довольно уверен, что это работает, потому что Secondable должен иметь вид (* -> *), где ((,) a) имеет этот тип, однако я не знаю, как реализовать Firstable для ((,) * a), где * связанная переменная. В моей интерпретации я пытаюсь сделать эквивалент:

instance Firstable (flip (,) a) where ...

Есть ли способ сделать это в Haskell? Желательно без расширений?

Спасибо!

15
задан Charles Durham 5 June 2012 в 15:03
поделиться