我是Haskell的新手。我注意到,哈斯克爾不支持記錄名稱重載:爲什麼Haskell/GHC支持記錄名稱重載
-- 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)
當我編譯此,我得到:
[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
由於Haskell的類型系統的「實力」,現在看來似乎應該是容易讓編譯器確定要訪問哪個字段
emp = Employee "Joe" "Smith" "111-22-3333"
man = Manager "Mary" "Jones" "333-22-1111" [emp]
firstName man
firstName emp
有沒有一些問題,我沒有看到。我知道Haskell報告不允許這樣做,但爲什麼不呢?
這完全不是您的問題的答案,但當您的情況出現時,我會將數據類型分割成單獨的模塊。例如,我可能會創建一個Employee模塊和一個Manager模塊,並分別將它們導入爲'E'和'M',然後使用'E.firstName','M.firstName'等這給了我相當好的語法。 (我並不是說這一定是個好主意,但是這就是我最終做的事情,在我的案例中它變得很好)。 – gspr
是的,但這看起來像一個在其他優雅的語言「kludge」。 – Ralph