저는 하스켈 초보자입니다. 내가 받기를 컴파일 할 때왜 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
는 하스켈 타입 시스템의 "힘"을 감안할 때, 그것은 보인다 컴파일러가 액세스 할 필드를 결정하기가 쉽습니다.
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
그래,하지만이게 다르게 우아한 언어의 "덩어리"같아. – Ralph