This question показывает определение экземпляра для (,) a b
, где a
является экземпляром Monoid
.Экземпляр Monad для пар
Однако, я не знаю, как написать аналогичную вещь для (,) a b
, а b
- это пример Monoid
? Я могу в принципе сделать это до тех пор, как я могу написать определение:
instance Monoid b => Monad ((,) ???) where
return a = (a,mempty)
~(a,b) >>= f = let (c,b1) in f a in (c,b `mappend` b1)
Таким образом, вопрос, как написать ???
часть?
UPDATE
На самом деле этот вопрос частный случай более общей проблемы: можно ли написать экземпляр класса типа, которые действуют на некоторых типах, которые не появляются в конце? В моем случае конструктор типа имеет значение (,) a b
, и я хочу сделать его экземпляром Monad a
, где a
не является последним параметром типа.
Это не очень хорошо, так как каждый раз, когда я хочу использовать 'RevTuple', я должен использовать конструктор типов и' totuple'. –
@ EarthEngine Hope, позже мы могли бы использовать типы: 'type RevTuple b a = (a, b)' в этой ситуации – wit
У вас может быть такое определение уже. Проблема в том, что вы не можете сказать «экземпляр Monoid b => Monad (RevTuple b)» в этом случае. –