Как использовать UndecidableInstances локально?

Да, я знаю, что 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, что по-прежнему не гарантировало бы завершение, но запрещало бы некоторые более пограничные случаи, как во втором фрагменте кода?

5
задан julkiewicz 14 February 2012 в 02:27
поделиться