2014-02-12 2 views
6

하스켈에서 레코드 구문을 사용하는 방법을 이해하지만 중괄호 안의 내용을 이해하는 데 어려움이 있습니다 입니다.하스켈 레코드 구문 desugared

data PairRecord = PR {foo::Int, bar::String} deriving (Eq,Show) 
x = (PR {foo=1, bar="init"}) 
y= x {foo=23} 
  • 무엇 {foo=23} 일이? 마지막 줄은 함수 x에 대한 인수 인 것처럼 보입니다. 이는 분명히 다릅니다.
  • {foo=23} 이외의 다른 조치는 뒤에 기록하는 것 외에는 어떤 것도 기록 할 수 있습니까?
  • do 표기법으로 할 수있는 것과 같은 공식적인 방법이 있나요?

답변

10

이 구문을 "레코드 업데이트"또는 "필드 레이블을 사용하여 업데이트"라고하며 Section 3.15.3 of the Haskell 2010 report에 설명되어 있습니다. 그것은 desugared 수 있습니다. 정확한 규칙은 보고서에 나와 있습니다. 당신의 예에서, x {foo = 23}의 desugaring 보고서는 section before, 3.15.2, on "Construction using field labels"에 설명 년대 desugaring에서 "선택"이라는 보조 기능을 사용하는

case x of 
    PR f b -> PR 23 b 
    _  -> error "Update error" 

주입니다.

+0

x {foo = 23}을 제외 할 수는 있지만 {foo = 23}은 아무런 의미가 없으며 유일한 사용법은 fron의 x (또는 다른 레코드)와 함께 사용됩니까? –

+1

네, 맞습니다. '{foo = ...} '문법은 레코드의 생성, 패턴 매치, 또는 레코드의 갱신에만 그리고 다른 컴포넌트와 결합해서 만 사용될 수 있습니다. 그것은 별 의미가 없습니다. – kosmikus

0

필요한 것은 lenses입니다. 하지만 먼저 패키지 렌즈를 설치해야합니다. 유형을보고하여

+1

오 하느님, 렌즈가 하스켈의 jQuery가 되나요? – Tarmil

+0

나는 렌즈를 좋아하기 때문에, 이것은 정말로 무엇이 요구되는지를 언급하지 않는다. 좋은 쪽지를 만들 수도 있지만 질문에 대답하지 않습니다. –

+0

@ Tarmil : 그게 정말 멀어요 ... –

0

:

:t PR 
PR :: Int -> String -> PairRecord 

은 그래서 당신이 PairRecord를 구축하기 위해의 int 및 문자열이 필요 의미합니다.

이제 PairRecord의 정의에서, 당신이 정의한 접근은 :

:t foo 
foo :: PairRecord -> Int 

(접근로) foo는 사용하기 위해, 당신은 PairRecord를 제공 할 필요가있다. 당신은 반환 값으로 지능을 가져옵니다

foo y 
23 

그것은 단독으로뿐만 아니라 foo는 의미가 의미가 없습니다,이 기능은 PairRecord이 필요합니다.

kosmikus 이미 지적 된 바와 같이, (액세서 ​​함수의 도움으로) (23)에 설정된 정수와

y= x {foo=23} 

기존 PairRecord에서 Y를 생성 구.

+0

foo *는 * 잘 정의 된 의미를 가지고 있습니다 : 이것은 PairRecord에서 Int까지의 함수입니다. 그러나 {foo = 23}은 앞에 x가없는 경우 아무 것도 아닙니다. –