Domanda

Questo è un follow-up di Perché sto ricevendo ", Non esaustiva, dei modelli in funzione di..." quando invoco il mio Haskell la funzione substring?

Capisco che l'utilizzo di -Wall, GHC grado di mettere in guardia contro non esaustivo di modelli.Mi chiedo qual è il motivo dietro non è un errore di compilazione, per impostazione predefinita, dato che è sempre possibile definire in modo esplicito una funzione parziale:

f :: [a] -> [b] -> Int
f [] _  = error "undefined for empty array"
f _ []  = error "undefined for empty array"
f (_:xs) (_:ys) = length xs + length ys

La questione non è GHC-specifici.

È perché...

  • nessuno voleva imporre un Haskell compilatore di eseguire questo tipo di analisi?
  • non esaustiva di ricerca per i motivi possono trovare alcuni ma non in tutti i casi?
  • parzialmente definite le funzioni sono considerati legittimi e utilizzato abbastanza spesso di non imporre il tipo di costruire sopra indicato?Se questo è il caso, si può spiegare a me perché non esaustiva, i modelli sono utili/legittimo?
È stato utile?

Soluzione

Ci sono casi in cui non ti dispiace che un criterio di corrispondenza non è esaustivo.Per esempio, anche se questo potrebbe non essere ottimale attuazione, non credo che sarebbe d'aiuto se non compilare:

fac 0 = 1
fac n | n > 0 = n * fac (n-1)

Che questo non è esaustivo (i numeri negativi non corrispondono a nessun caso) non importa, per l'utilizzo tipico della funzione fattoriale.

Inoltre, potrebbe non essere generalmente possibile decidere per il compilatore, se un criterio di corrispondenza è esaustivo:

mod2 :: Integer -> Integer
mod2 n | even n = 0
mod2 n | odd n  = 1

Qui tutti i casi devono essere coperti, ma il compilatore probabilmente non può rilevare.Visto che le guardie potrebbero essere arbitrariamente complesso, il compilatore non può sempre decidere se i modelli sono esaustivi.Naturalmente questo esempio sarebbe meglio essere scritto con otherwise, ma penso che dovrebbero compilare, nella sua forma attuale.

Altri suggerimenti

È possibile utilizzare -Werror per attivare gli avvisi in errori.Non so se si può girare solo non esaustivo di modelli di avvisi di errori, mi dispiace!

Come per la terza parte della tua domanda:

Io a volte scrivere un certo numero di funzioni che tendono a lavorare fianco a fianco e hanno proprietà che non è possibile esprimere facilmente in Haskell.Almeno alcune di queste funzioni tendono ad avere, non esaustiva, di modelli, di solito i 'consumatori'.Questo è, per esempio, le funzioni che sono "una sorta di' uno l'inverso dell'altro.

Un giocattolo esempio:

duplicate :: [a] -> [a]
duplicate [] = []
duplicate (x:xs) = x : x : (duplicate xs)

removeDuplicates :: Eq a => [a] -> [a]
removeDuplicates [] = []
removeDuplicates (x:y:xs) | x == y = x : removeDuplicates xs

Ora è abbastanza facile vedere che removeDuplicates (duplicate as) è uguale a as (qualora il tipo di elemento è in Eq), ma in generale duplicate (removeDuplicates bs) andrà in crash, perché ci sono un numero dispari di elementi o 2 consecutivi elementi diversi.Se non va in crash, è perché bs è stata prodotta da (o potrebbe essere stato prodotto da) duplicate in primo luogo!.

Così abbiamo le seguenti leggi (non valido Haskell):

removeDuplicates . duplicate == id
duplicate . removeDuplicates == id (for values in the range of duplicate)

Ora, se si vuole evitare, non esaustiva, i modelli qui, si potrebbe fare removeDuplicates ritorno Maybe [a], o aggiungere messaggi di errore per la mancanza dei casi.Si potrebbe anche fare qualcosa lungo le linee di

newtype DuplicatedList a = DuplicatedList [a]

duplicate :: [a] -> DuplicatedList a
removeDuplicates :: Eq a => DuplicatedList a -> [a]
-- implementations omitted

Tutto questo è necessario, perché si può facilmente express", una lista di lunghezza, con coppie consecutive di elementi uguali' in Haskell tipo di sistema (a meno che non sei Oleg :)

Ma se non si esporta removeDuplicates Penso che sia perfettamente a posto non esaustivo modelli qui.Non appena si esegue l'esportazione, si perde il controllo su di ingressi e avrà a che fare con la mancanza dei casi!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top