2012-02-14 10 views
5

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?

Respuesta

4

Hasta ahora, los pragmas de idioma son por módulo, por lo que la respuesta a la primera pregunta es no. En cuanto a la segunda pregunta, no estoy muy seguro, pero no conozco otra extensión que IndecisasInstancias que permita la instancia.

Sin embargo, UndecidableInstances no es tan malo, solo permite que el verificador de tipos intente resolver instancias en las que no puede probar la terminación. Sin embargo, la pila de contexto evita que se buclee para siempre.

Cuestiones relacionadas