2017-06-23 2 views
9

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?

Antwort

6

-XDuplicateRecordFields führt derzeit keine Typen von Argumenten aus.

Siehe GHC user guide section about this extension.

Wir leiten jedoch nicht den Typ des Arguments ab, um den Datentyp zu bestimmen, oder haben irgendeine Möglichkeit, die Wahl auf den Constraint-Solver zu verschieben. Daher ist das folgende mehrdeutig:

Aber die Dinge verbessern sich. So könnte erwarten wir und schließlich das gewünschte Verhalten erhalten:

https://prime.haskell.org/wiki/TypeDirectedNameResolution

+0

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

Verwandte Themen