Да, я знаю, что UndecidableInstances
может быть плохим. Я очень старался спроектировать свой модуль так, чтобы он не нуждался в нем, однако у меня получилось что-то вроде этого:
instance Foo x (C x y) => Bar (C x y) where
...
и изменение его сделает API значительно более уродливым. Я никогда не выводил Foo
из Bar
, поэтому нет возможности сделать цикл.
С другой стороны, включение UndecidableInstances
позволяет не замечать глупых ошибок. Например, я могу по ошибке написать что-то вроде:
instance Foo x (C x z) => Bar (C x y) where
...
где z
никогда не появляется в правой части.
Вопрос: Можно ли использовать UndecidableInstances
локально в модуле, т.е. явно отмечать места, где отменяются обычные правила завершения?
Конечно, это не поможет с завершением, но сделает решение об использовании этого расширения более обоснованным.
Вопрос 2: Есть ли что-то более слабое, чем UndecidableInstances
, что по-прежнему не гарантировало бы завершение, но запрещало бы некоторые более пограничные случаи, как во втором фрагменте кода?