Soy un novato de Haskell. Me he dado cuenta de que Haskell no admite nombre de registro de sobrecarga:¿Por qué Haskell/GHC no admite la sobrecarga del nombre de registro?
-- 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)
Cuando compilo este recibo:
[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
Teniendo en cuenta la "fuerza" del sistema de tipos de Haskell, parece que debería ser fácil para el compilador determinar a qué campo acceder en
emp = Employee "Joe" "Smith" "111-22-3333"
man = Manager "Mary" "Jones" "333-22-1111" [emp]
firstName man
firstName emp
Hay algún problema que no estoy viendo. Sé que el Informe Haskell no permite esto, pero ¿por qué no?
Esto no es en absoluto una respuesta a su pregunta, pero usualmente dividir los tipos de datos en módulos separados cada vez que surja una situación como la suya. Podría, por ejemplo, hacer un módulo 'Empleado' y un módulo' Administrador', e importarlos calificados como digamos 'E' y' M' respectivamente, y luego usar 'E.firstName',' M.firstName', etc. Esto me da una sintaxis razonablemente agradable. (No estoy diciendo que esto sea necesariamente una buena idea, pero es lo que terminé haciendo y resultó muy bien en mis casos). – gspr
Sí, pero esto parece ser un "kludge" en un lenguaje por lo demás elegante. – Ralph