Gibt es [ein] Werkzeug, das mir helfen kann, diese Art von Fehler zu verhindern?
Nein, aber es könnte sein.
Wie Sie wissen, generiert die Syntax für Datensätze automatisch Getter mit demselben Namen wie die von Ihnen definierten Attribute. Daher ist der Code
data Person = Adult { pName :: String}
| Kid { pName :: String
, pAge :: Int
} deriving Show
schafft die Funktionen pName :: Person -> String
und pAge :: Person -> Int
. Nun, angenommen Haskell hatte Subtyping. Wenn dies der Fall wäre, könnte Kid
ein Subtyp von Person
sein, und pAge
könnte den geeigneteren Typ Kid -> String
haben. Haskell hat jedoch nicht haben Subtyping, und es gibt daher keine Kid
Art.
nun gegeben, dass Person -> String
die spezifische Art ist, dass wir zu pAge
geben können, warnen, warum nicht, dass pAge
eine Teilfunktion bei der Kompilierung ist? Lassen Sie mich durch Bezugnahme auf die Liste Beispiel
data List a = Cons { head :: a, tail :: List a } | Empty
In diesem Beispiel die Frage abzulenken, head
und tail
sind Teilfunktionen: Die beiden Komponenten einer nicht-leere Liste, aber (wegen Haskell Mangel an Subtyping) bedeutungslos Accessoren auf der leeren Liste. Also, warum keine Warnung standardmäßig? Nun, standardmäßig kennen Sie den Code, den Sie geschrieben haben. Der Compiler gibt keine Warnungen aus, wenn Sie unsafePerformIO
verwenden. Da Sie der Programmierer hier sind, wird erwartet, dass Sie solche Dinge verantwortungsvoll verwenden.
So tl; dr: Wenn Sie die Warnung hier wollen:
getAge :: Person -> Int
getAge p = pAge p
dann bist du kein Glück, da das Typsystem nicht genügend Informationen, um ableiten, dass dies ein Problem ist.
Wenn Sie die Warnung hier wollen:
data Person = Adult | Kid { pAge :: Int }
dann würde ich bin sicher, dass es trivial zu implementieren sein: nur prüfen, ob ein bestimmtes Feld in einigen Konstrukteuren existiert, andere aber nicht. Aber ich sehe nicht ein, dass diese Warnung für alle von großem Nutzen ist. Einige könnten sich beschweren, dass es nur Lärm wäre.
Ich wette, die GHC-Leute wären bereit, dafür eine Warnung zu kleben. Sie sollten eine Feature-Anfrage auf [Trac] (http://hackage.haskell.org/trac/ghc/newticket?type=feature+request) einreichen! –
Es gibt ein allgemeines Gefühl der Unzufriedenheit um Rekorde in ihrer gegenwärtigen Form. Einige Leute untersuchen Alternativen. In der Zwischenzeit sind Mehrfachkonstruktor-Aufzeichnungen nicht empfehlenswert und sollten eine Warnung ihrer eigenen sein :-) –
http://hackage.haskell.org/trac/ghc/ticket/7169 - Sie könnten sich selbst zu cc hinzufügen. – sdcvvc