2013-01-23 6 views
29

Supponiamo che un progettista di librerie Haskell decida di utilizzare UndecidableInstances per qualche motivo. La biblioteca si compila bene. Supponiamo ora che alcuni programmi utilizzino la libreria (come definisce alcune istanze delle sue classi di tipi), ma non usa l'estensione. Può accadere che la compilazione fallisca (non termina)?È possibile utilizzare localmente UndecidableInstances pragma ha conseguenze globali sulla conclusione della compilazione?

Se un tale scenario può accadere, sarei felice di vedere un esempio. Ad esempio, come mtl utilizza molto UndecidableInstances, è possibile scrivere un programma che dipende da mtl (o qualsiasi altra libreria standard che utilizza l'estensione), non utilizza lo stesso UndecidableInstances, ma non riesce a compilare a causa della indecidibilità?

risposta

22

Ottima domanda!

In generale questo è certamente possibile. Considera questo modulo:

{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, UndecidableInstances #-} 

module M where 

class C a b | a -> b where 
    f :: a -> b 

instance C a b => C [a] [b] 
    where f = map f 

Compilare da solo bene. Tuttavia, se si importa il modulo e definire

g x = x + f [x] 

si otterrà

Context reduction stack overflow; size = 201 
Use -fcontext-stack=N to increase stack size to N 
    C [b] b 
In the second argument of `(+)', namely `f [x]' 
In the expression: x + f [x] 
In an equation for `g': g x = x + f [x] 

Per quanto riguarda i casi MTL, io non vedo come qualcosa di simile a questo è possibile, ma anche non ho la prova che non lo è.

+5

Stavo giocando con la tua soluzione e sono riuscito a ridurlo a 'classe C a dove f :: a -> a' e' istanza C [[a]] => C [a] dove f = id' , che non ha bisogno di altre estensioni ma 'UndecidableInstances'. –

+4

Dopo aver esaminato 'mtl', credo che non sia possibile causare il loop del compilatore usandolo. L'unica ragione per cui ha bisogno dell'estensione è perché alcune delle sue istanze non soddisfano la [Condizione di copertura] (http://www.haskell.org/ghc/docs/7.0.1/html/users_guide/type-class-extensions.html# esempio-rules). Ma l'idea alla base della condizione è soddisfatta - tutte le variabili di tipo rhs possono essere desunte dalle dichiarazioni di istanza di 'mtl'. –

+0

Huh, sono sorpreso 'C [[a]]' non richiede 'FlexibleContexts'. –

Problemi correlati