Beachten Sie Folgendes:Dumme duplizierten Datensatzfelder Fehler
{-# LANGUAGE DuplicateRecordFields #-}
data A = A { name :: String }
data B = B { name :: String }
main = print $ name (A "Alice")
Wenn kompiliert, ich die folgende Meldung (auf GHC 8.0.2)
duplicatedrecords.hs:7:16: error:
Ambiguous occurrence ‘name’
It could refer to either the field ‘name’,
defined at duplicatedrecords.hs:5:14
or the field ‘name’, defined at duplicatedrecords.hs:3:14
Aber wenn ich die main
Zeile wie folgt ändern :
main = print $ name ((A "Alice") :: A)
Kompilierung wird erfolgreich fortgesetzt.
Warum ist das? Die Typensignatur :: A
scheint mir überflüssig zu sein, da der A
Konstruktor dem Compiler sicherlich klar macht, dass (A "Alice")
vom Typ A
ist. Aber aus irgendeinem Grund macht es einen Unterschied. Warum ist das und gibt es eine Möglichkeit, dass ich das kompilieren kann, ohne überall zusätzliche Signaturen zu verschwenden?
Hinweis:
Es ist erwähnenswert, dass die folgenden kompiliert fein:
data A = A { a_name :: String }
data B = B { b_name :: String }
class Name t where
name :: t -> String
instance Name A where name = a_name
instance Name B where name = b_name
main = print $ name (A "Alice")
Wir können sogar noch weiter gehen Sie wie folgt vor, verschiedene Ergebnistypen erlaubt:
{-# LANGUAGE TypeFamilies #-}
data A = A { a_name :: String }
data B = B { b_name :: Int }
class Name t where
type family T t
name :: t -> T t
instance Name A where
type T A = String
name = a_name
instance Name B where
type T B = Int
name = b_name
main = print $ name (A "Alice")
Es scheint, Wie GHC muss nur eine Klasse für jeden eindeutigen Datensatznamen und eine Instanz für jeden Datensatz in jedem Datentyp hinzugefügt werden. Dies bedeutet jedoch, dass name x == name y
nicht impliziert, dass die Typen x
und y
die gleichen sind, aber ich würde erwarten, dass bei der Verwendung dieser Erweiterung sowieso.
Frage mich nur, ob es etwas schwierig ist, ich vermisse hier in Bezug auf die Implementierung oder dass es nur jemanden braucht, um es zu tun?
Dank Shersh, ist das, was ich wollte zu sagen. Das aktuelle Verhalten ist ein Halb-Haus auf dem Weg zu dem, was Clinton sucht. In der Zwischenzeit konnte man sich die Linsenverpackung (en) ansehen. – AntC