Я играл вокруг с классами типов и сделал это: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
I 'm довольно уверен, что это работает, потому что Secondable должен иметь kind (* -> *), где ((,) a) имеет этот тип, однако я не знаю, как реализовать Initialable for ((,) * a) где * is связанная переменная. В моей интерпретации я пытаюсь сделать эквивалент:
instance Firstable (flip (,) a) where ...
Есть ли способ сделать это в Haskell? Предпочтительно без расширений?
Спасибо!
AFAIK, нет: вам нужно 'TypeSynonymInstances', но тип синонимы не могут быть частично оценены. Но знаете ли вы об альтернативе с «MultiParamTypeClasses»? Это, наверное, немного уродливо, но это работает. – leftaroundabout
Вам может быть интересно, как пакет кортежей обрабатывает это: http://hackage.haskell.org/package/tuple –
@JohnL действительно круто, спасибо! –