Haskell의 데이터 선언에 레코드 구문을 언제 사용해야합니까?

StackOverflow https://stackoverflow.com/questions/1802015

  •  05-07-2019
  •  | 
  •  

문제

레코드 구문은 자신의 액세서 기능을 작성하는 것과 비교할 때 매우 편리한 것 같습니다. 나는 일반 데이터 선언 구문보다 레코드 구문을 사용하는 것이 가장 좋은시기에 대한 지침을 본 적이 없으므로 여기서 물어볼 것입니다.

도움이 되었습니까?

해결책

두 가지 상황에서 레코드 구문을 사용해야합니다.

  1. 유형에는 많은 필드가 있습니다
  2. 유형 선언은 의도 된 레이아웃에 대한 단서를 제공하지 않습니다.

예를 들어 포인트 유형은 간단히 다음과 같이 선언 할 수 있습니다.

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)   

레코드 구문은 코드를보다 읽기 쉽게 만들었고 우리를 위해 모든 액세서 기능을 자동으로 정의하여 많은 타이핑을 저장했습니다!

다른 팁

복잡한 멀티 필드 데이터 외에도 newtypeS는 종종 레코드 구문으로 정의됩니다. 이러한 경우 중 하나의 경우 레코드 구문을 사용하는 단점은 없지만 합성 유형의 경우 레코드 액세서가 일반적으로 의미가 없습니다. 예를 들어:

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 둘 다 여전히 그렇지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top