2015-03-25 6 views
11

Credo che il titolo è già auto esplicativo, ma ecco un esempio in ogni caso per dimostrare il mio punto:Perché GHC avvisa solo sulle classi implementate parziali e non sull'errore?

class Foo a where 
    someFunction :: a -> a -> Bool 

instance Foo Bool 

Quando compilo questo il compilatore dà un avvertimento:

Warning: 
    No explicit method or default declaration for `someFunction' 
    in the instance declaration for `Foo Bool' 

Chiamando la funzione sarà ora causare un errore di runtime. Perché questo è un avvertimento e non un errore in fase di compilazione? E c'è un modo per rendere questo un errore in fase di compilazione, invece?

risposta

8

Il GHC documentation fornisce un esempio in cui un avvertimento è sufficiente:

-fwarn-missing-methods:

Questa opzione è attiva per impostazione predefinita, e si avverte ogni volta che un dichiarazione di istanza manca uno o più metodi, e il la corrispondente dichiarazione di classe non ha una dichiarazione di default per loro.

L'avviso viene eliminato se il nome del metodo inizia con un trattino basso. Ecco un esempio in cui questo è utile:

class C a where 
    _simpleFn :: a -> String 
    complexFn :: a -> a -> String 
    complexFn x y = ... _simpleFn ... 

L'idea è che: (a) gli utenti della classe servirà solo a chiamare complexFn; mai _simpleFn; e (b) le dichiarazioni di istanza possono definire sia complexFn o _simpleFn.

Il pragma MINIMAL può essere utilizzato per modificare quale combinazione di metodi sarà richiesta per le istanze di una particolare classe. Vedi Section 7.20.5, “MINIMAL pragma”.

Questo è il motivo per cui i metodi mancanti non provocano un errore, ma un avvertimento. Se si desidera rendere gli avvertimenti fatali, utilizzare -Werror. Dato che non c'è -ferr-missing-methods, -Werror è l'unico modo per rendere -fwarn-missing-methods un errore del compilatore.

+1

Non sarebbe sufficiente nell'esempio precedente per specificare correttamente il pragma MINIMAL per correggere un avviso/errore? Cioè nell'esempio sopra aggiungendo '{- # MINIMAL _simpleFn | complexFn # -} 'renderebbe anche il compilatore felice, e quindi non fornisce ancora una ragione per i metodi mancanti per dare un avvertimento invece di un errore. – Tiddo

+1

@ Tiddo: la vera ragione è probabilmente storica. Detto questo, si può applicare una patch ['warnMissingMethodOrAT'] (https://github.com/ghc/ghc/blob/33cfa5ff9db4e7886b3e7c2eed5ac1c75436bc4c/compiler/typecheck/TcInstDcls.hs#L1614-L1622) per creare il comportamento desiderato. È possibile presentare una richiesta di un problema/funzione. – Zeta

Problemi correlati