私はハスケル初心者です。私は私が得るこれをコンパイルするとなぜ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)
::私はHaskellはレコード名のオーバーロードをサポートしていないことに気づいた、それがあるべきよう
[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
私には見えない問題がありますか?私はハスケル・レポートがこれを許さないことを知っていますが、なぜそうではありませんか?
これはまったくあなたの質問に対する答えではありませんが、あなたのような状況が発生するたびにデータ型を別々のモジュールに分割します。たとえば、 'Employee'モジュールと' Manager'モジュールを作成し、それぞれ 'E'と' M'のように修飾し、 'E.firstName'、' M.firstName'などを使用しますこれは私に合理的にいい構文を与えます。 (私はこれが必ずしも良いアイデアだと言っているわけではありませんが、それは私がやり遂げたことであり、私の場合はうまくいきました)。 – gspr
ええ、これはそうでなければエレガントな言葉では "kludge"のようです。 – Ralph