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