Хороший ответ: Нет, то, что вы надеетесь сделать, на самом деле не жизнеспособно. Вы можете написать экземпляр, который выглядит так, как будто он выполняет то, что вы хотите, возможно, в процессе могут потребоваться некоторые расширения GHC, но он не будет работать так, как вам бы хотелось.
Неразумный ответ: Вероятно, вы можете достичь желаемого, используя страшное метапрограммирование на уровне типов, но это может оказаться сложным. Это действительно не рекомендуется, если вам абсолютно не нужно, чтобы это работало по какой-то причине.
Официально экземпляры не могут реально зависеть от других экземпляров, потому что GHC смотрит только на «голову экземпляра» при принятии решений, а ограничения класса находятся в «контексте». Чтобы создать здесь что-то вроде «синонима класса типов», вам нужно написать что-то вроде Monad
для всех возможных типов , что, очевидно, не имеет смысла. Вы будете совпадать с другими экземплярами Monad
, у которых есть свои проблемы.
Кроме того, я не думаю, что такой экземпляр будет удовлетворять требованиям проверки завершения для разрешения экземпляра, поэтому вам также понадобится расширение UndecidableInstances
, что означает возможность писать экземпляры, которые будут отправлять GHC проверка типа в бесконечный цикл.
Если вы действительно хотите пройти по этой кроличьей норе, зайдите на сайт Олега Киселева немного; он своего рода покровитель метапрограммирования на уровне типов в Haskell.
Это забавная штука, конечно, но если вы просто хотите написать код и заставить его работать, вероятно, не стоит усилий.
Редактировать: Хорошо, задним числом я переоценил проблему здесь. Нечто подобное PhantomMonad
отлично работает как разовое и должно делать то, что вы хотите, учитывая расширения Overlapping
- и UndecidableInstances
GHC. Сложные вещи начинаются, когда вы хотите сделать что-то намного более сложное, чем то, о чем идет речь. Я искренне благодарю Нормана Рэмси за то, что он позвонил мне - я действительно должен был знать лучше.
Я все еще не очень рекомендую делать подобные вещи без веской причины, но это не так плохо, как я их озвучил. Mea culpa.