Создание собственного преобразователя монад в экземпляр MonadError - PullRequest
5 голосов
/ 31 марта 2012

Я хочу сделать мой преобразователь монад экземпляром MonadError, если преобразованная монада является экземпляром.По сути, я хочу, чтобы мой преобразователь работал так же, как встроенные преобразователи, например, существует экземпляр MonadError для StateT:

MonadError e m => MonadError e (StateT s m)

.1009 * Но GHC начал жаловаться на неразрешимые экземпляры, очевидно, что библиотека MTL просто разрешает неразрешимые экземпляры, но есть ли способ избежать этого?Или в этом случае все нормально и никаких проблем не возникнет?

1 Ответ

8 голосов
/ 31 марта 2012

Это в принципе нормально.UndecidableInstances не все так страшно;все это означает, что компилятор может вместо того, чтобы найти экземпляр, войти в бесконечный цикл.Это звучит довольно плохо, пока вы не поймете, что GHC на самом деле имеет ограничение на количество шагов, которые нужно предпринять, чтобы найти экземпляр;ничто не пойдет не так, если вы не напишите плохой экземпляр, и сообщения об ошибках, которые вы получите, как правило, сделают очень очевидным, что пошло не так.IncoherentInstances).

Причина, по которой он жалуется, заключается в том, что MonadError имеет функциональную зависимость от m до e.Это означает, что выбор m определяет, каким должен быть e;то есть каждый m связан только с одним e.Проверка для этого (Условие покрытия) является консервативной, поэтому легко столкнуться с такими проблемами, когда вы пытаетесь «повторить уровень», чтобы указать e.

1 В нем будут перечислены все экземпляры, на которые он смотрел, чтобы попытаться найти тот, который ищет, так что вы увидите кучу повторяющихся строк.Но обычно вы даже не столкнетесь с такими проблемами в первую очередь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...