2015-03-05 10 views
11

Ho scritto rapidamente un codice in Haskell e ho utilizzato una funzione non totale pericolosa, ovvero fromJust (dove mi aspetto un valore dall'input). Ho intenzione di pensare più tardi che tipo di stile di gestione degli errori voglio usare.GHC può avvisare in merito all'uso di funzioni non totali pericolose?

può GHC aiutarmi a fare in modo che ho sbarazzato di tutti gli usi di funzioni non totale pericolose (come fromJust o head, che potrebbe mandare in crash), dammi avvertimenti dove sono.

+2

L'inferenza di parzialità è attualmente in discussione dagli sviluppatori di GHC. Nel frattempo, la soluzione migliore è probabilmente quella di nascondere le importazioni di tali funzioni e (per assicurarsi che siano davvero nascoste) ridefinirle da soli: 'fromJust =()' dovrebbe fare il trucco. – dfeuer

+3

Anche solo ridefinirli in un modulo, che viene importato come non qualificato per "attivare l'avviso". Avrai quindi un errore di ambiguità che ti indica in qualunque posto tu usi effettivamente le versioni del Preludio (a meno che tu non si qualifichi, come in Prelude.fromJust'). Tuttavia, non sarà di aiuto per le funzioni parziali che si utilizzano dalle importazioni qualificate di altri moduli. – Ben

risposta

3

GHC può mettere in guardia sulle definizioni con motivi parziali con -fwarn-incomplete-patterns (sebbene non avvisi sugli utilizzi di valori che includono motivi incompleti). Inoltre, Neil Mitchell's catch tenta un'analisi leggermente più dettagliata per identificare invocazioni sicure e non sicure di funzioni parziali. (Anche se, ovviamente, questo è un problema indecidibile in generale, non sarà sempre corretto!)

+0

Solo un appunto per me. Mi è venuto in mente che ogni volta che voglio usare un pattern match non totale in un codice praticamente utile (e credo che semanticamente esaurisco tutti i casi reali), non dovrei. In alcuni casi dovrebbe essere almeno possibile rendere l'ipotesi più esplicita avvolgendo la funzione non totale in una classe e definirla vicino al punto in cui è ovvio che sia OK (come soluzione per codice totalmente non sicuro e incontrollabile). Esempio: [un vincolo 'ToJSONObject'] (https://github.com/bos/aeson/issues/79#issuecomment-108959252) per i dati codificati genericamente e quindi decostruiti. –

Problemi correlati