Sí, sé que UndecidableInstances
puede ser malo. Realmente esforzado por diseñar mi módulo de modo que no lo necesita sin embargo tengo algo como esto:¿Cómo usar Incompatibilidades Indecibles localmente?
instance Foo x (C x y) => Bar (C x y) where
...
y el cambio que haría que el API sustancialmente más feo. Nunca deriva Foo
de Bar
por lo que no hay forma de hacer un ciclo.
Por otra parte, habilitar UndecidableInstances
hace que los errores tontos sean fáciles de pasar por alto. Por ejemplo, yo podría escribir por error algo como:
instance Foo x (C x z) => Bar (C x y) where
...
donde z
aparece nunca en el lado derecho.
Pregunta: ¿Es posible utilizar UndecidableInstances
localmente en un módulo, es decir, marcar explícitamente lugares donde se levantan las reglas de terminación habituales?
Por supuesto, no ayudará con la finalización, pero tomará la decisión de utilizar esta extensión más informada.
Pregunta 2: ¿Hay algo más débil que UndecidableInstances
que todavía no garantizaría la terminación, pero que impediría que algunos más casos dudosos como el segundo fragmento de código?