2014-06-22 19 views
26

Ho questo codice e non verrà compilato, evidenziando la destra x e di Punto3 e scrivendo: "Dichiarazioni multiple di x" e "Dichiarazioni multiple di y". Cosa c'è che non va? Can not Point2 e Point3 hanno lo stesso nome membro?Dichiarazioni multiple di x

data Point2  = Point2 {x :: Float, y :: Float} 
data Point3  = Point3 {x :: Float, y :: Float, z :: Float} 

risposta

38

No, questo non è attualmente supportato. L'approccio standard consiste nel prefissare ogni campo con qualcosa di unico per il particolare tipo di dati, ad es. p2x, p2y, p3x ecc

La ragione ciò non è supportato è che ciascuna di campo di record genera implicitamente una funzione "selettore", ad esempio x :: Point2 -> Float. Avere due campi con lo stesso nome nello stesso ambito genererebbe uno scontro.

Questo è un bugbear di vecchia data per molte persone e verrà risolto dall'imminente estensione della lingua OverloadedRecordFields, che si spera faccia parte di GHC 7.12 (previsto per l'inizio del 2016).

Se abilitata, questa estensione consentirà lo stesso nome di campo da utilizzare in più record. Il selettore di campo avrà un tipo sovraccarico che verrà generalmente risolto per tipo di inferenza.

+2

Peccato non abbiamo una soluzione per questo caso. – jiyinyiyong

+0

... ma qual è lo scopo di "DisambiguateRecordFields"? –

3

L'estensione DuplicateRecordFields consente ai record Haskell esistenti di utilizzare etichette di campo duplicate.

Vedi DuplicateRecordFields

OverloadedRecordFields non funziona per me con GHC-8.0.2

+0

Grazie, credo che avrei dovuto guardare le note di rilascio di GHC. Questo è stato uno dei miei reclami # 1! –