Sono un principiante Haskell. Ho notato che Haskell non supporta dati del codice di sovraccarico:Perché Haskell/GHC non supportano il nome del record sovraccarico
-- Records.hs
data Employee = Employee
{ firstName :: String
, lastName :: String
, ssn :: String
} deriving (Show, Eq)
data Manager = Manager
{ firstName :: String
, lastName :: String
, ssn :: String
, subordinates :: [Employee]
} deriving (Show, Eq)
Quando compilo questo ottengo:
[1 of 1] Compiling Main (Records.hs, Records.o)
Records.hs:10:5:
Multiple declarations of `firstName'
Declared at: Records.hs:4:5
Records.hs:10:5
Records.hs:11:5:
Multiple declarations of `lastName'
Declared at: Records.hs:5:5
Records.hs:11:5
Records.hs:12:5:
Multiple declarations of `ssn'
Declared at: Records.hs:6:5
Records.hs:12:5
Data la "forza" del sistema di tipo Haskell, sembra come dovrebbe essere facile per il compilatore per determinare quale campo accedere in
emp = Employee "Joe" "Smith" "111-22-3333"
man = Manager "Mary" "Jones" "333-22-1111" [emp]
firstName man
firstName emp
C'è qualche problema che non vedo. So che il rapporto Haskell non lo consente, ma perché no?
Questa non è affatto una risposta alla tua domanda, ma di solito divido i tipi di dati in moduli separati ogni volta che si presenta una situazione come la tua. Potrei, ad esempio, creare un modulo 'Employee' e un modulo' Manager', e importarli come 'E' e 'M' rispettivamente, e poi usare' E.primo nome', 'M.primo nome', ecc. Questo mi dà una sintassi ragionevolmente bella. (Non sto dicendo che sia necessariamente una buona idea, ma è quello che ho finito per fare e si è rivelato bene nei miei casi). – gspr
Sì, ma questo sembra un "kludge" in un linguaggio altrimenti elegante. – Ralph