2015-03-05 11 views
11

Ich habe schnell etwas Code in Haskell geschrieben und eine gefährliche Nicht-Gesamtfunktion verwendet, nämlich (wobei ich einen Wert von der Eingabe erwarte). Ich werde später darüber nachdenken, welche Art von Fehlerbehandlung ich verwenden möchte.Kann GHC vor der Verwendung gefährlicher Nicht-Gesamtfunktionen warnen?

Kann GHC mir helfen sicherzustellen, dass ich alle Verwendungen von gefährlichen Nicht-Gesamtfunktionen losgeworden bin (wie oder head, die abstürzen könnten), gib mir Warnungen, wo sie sind.

+2

Partialitätsschluss wird derzeit von den GHC-Entwicklern diskutiert. In der Zwischenzeit ist es wahrscheinlich am besten, die Importe dieser Funktionen zu verbergen und (um sicherzustellen, dass sie wirklich versteckt sind) sie selbst neu zu definieren: 'fromJust =()' sollte den Trick machen. – dfeuer

+3

Sie können sie sogar in einem Modul neu definieren, das Sie unqualifiziert importieren, um "die Warnung zu aktivieren". Sie erhalten dann einen Mehrdeutigkeitsfehler, der Sie auf Orte verweist, an denen Sie tatsächlich die Versionen des Preludes verwenden (es sei denn, Sie qualifizieren sich dann wie in "Prelude.fromJust"). Es hilft jedoch nicht für Teilfunktionen, die Sie von qualifizierten Importen anderer Module verwenden. – Ben

Antwort

3

GHC kann über Definitionen mit partiellen Mustern mit -fwarn-incomplete-patterns warnen (obwohl nicht über die Verwendung von Werten gewarnt wird, die unvollständige Muster enthalten). Zusätzlich versucht Neil Mitchells catch eine etwas detailliertere Analyse, um sichere und unsichere Aufrufe von Teilfunktionen zu identifizieren. (Obwohl dies natürlich ein unentscheidbares Problem im Allgemeinen ist, wird es nicht immer richtig sein!)

+0

Nur eine Anmerkung für mich. Ich kam auf die Idee, dass, wann immer ich eine Nicht-Gesamtmuster-Übereinstimmung in einem praktisch nützlichen Code verwenden möchte (und ich glaube, dass ich semantisch alle echten Fälle erschöpfe), sollte ich nicht. In einigen Fällen sollte es zumindest möglich sein, die Annahme expliziter zu machen, indem die Nicht-Gesamtfunktion in einer Klasse eingeschlossen und nahe der Stelle definiert wird, an der es offensichtlich OK ist (als Workaround für völlig unsicheren und unkontrollierbaren Code). Beispiel: [eine 'ToJSONObject'-Einschränkung] (https://github.com/bos/aeson/issues/79#issuecomment-108959252) für generisch dekonstruierte und dekonstruierte Daten. –

Verwandte Themen