Haskell의 데이터 선언에 레코드 구문을 언제 사용해야합니까?
문제
레코드 구문은 자신의 액세서 기능을 작성하는 것과 비교할 때 매우 편리한 것 같습니다. 나는 일반 데이터 선언 구문보다 레코드 구문을 사용하는 것이 가장 좋은시기에 대한 지침을 본 적이 없으므로 여기서 물어볼 것입니다.
해결책
두 가지 상황에서 레코드 구문을 사용해야합니다.
- 유형에는 많은 필드가 있습니다
- 유형 선언은 의도 된 레이아웃에 대한 단서를 제공하지 않습니다.
예를 들어 포인트 유형은 간단히 다음과 같이 선언 할 수 있습니다.
data Point = Point Int Int deriving (Show)
첫 번째 int가 엑스 좌표와 두 번째는 와이. 그러나 다음 유형의 선언의 경우는 다릅니다 ( 당신에게 큰 선을 위해 Haskell을 배우십시오):
data Person = Person String String Int Float String String deriving (Show)
의도 된 유형 레이아웃은 이름, 성, 연령, 높이, 전화 번호 및 좋아하는 아이스크림 맛입니다. 그러나 이것은 위의 선언에서 분명하지 않습니다. 레코드 구문은 여기에 편리합니다.
data Person = Person { firstName :: String
, lastName :: String
, age :: Int
, height :: Float
, phoneNumber :: String
, flavor :: String
} deriving (Show)
레코드 구문은 코드를보다 읽기 쉽게 만들었고 우리를 위해 모든 액세서 기능을 자동으로 정의하여 많은 타이핑을 저장했습니다!
다른 팁
복잡한 멀티 필드 데이터 외에도 newtype
S는 종종 레코드 구문으로 정의됩니다. 이러한 경우 중 하나의 경우 레코드 구문을 사용하는 단점은 없지만 합성 유형의 경우 레코드 액세서가 일반적으로 의미가 없습니다. 예를 들어:
data Either a b = Left { getLeft :: a } | Right { getRight :: b }
유효하지만 액세서 기능은 있습니다 부분적 - 쓰는 것은 오류입니다 getLeft (Right "banana")
. 이런 이유로, 그러한 접근자들은 일반적으로 낙담하고 있습니다. 같은 것 getLeft :: Either a b -> Maybe a
더 일반적이며 수동으로 정의해야합니다. 그러나 접근자는 이름을 공유 할 수 있습니다.
data Item = Food { description :: String, tastiness :: Integer }
| Wand { description :: String, magic :: Integer }
지금 description
비록 총체적입니다 tastiness
그리고 magic
둘 다 여전히 그렇지 않습니다.