2012-01-18 5 views
28

난 그냥 하스켈 코드의 조각에서 다음 구문을 가로 질러? {}에 자동으로 일치하는 인수가 있습니까?이 haskell 구문은 무엇입니까?</p> <pre><code>data A = A Int Int | B m :: A -> Int m a = case a of A{} -> 1 _ -> 2 </code></pre> <p>여기에서하고있는 <code>A{}</code> 무엇입니까 -

나는 이것이 하스켈이 많은 함수와 규칙적인 대수 데이터 타입에 대해 구문 저도를 기록한다는 사실을 이용하고 있다는 느낌이 들었다. 그럴까요?

+5

매일 새로운 것을 배우고 5 년 동안 하스켈을 프로그래밍했습니다. 내 인생에서 문법을 본 적이 없어요. –

답변

28

예, A{}은 형식이 레코드 구문으로 선언되었는지 여부에 관계없이 A 생성자로 생성 된 값과 일치합니다.

language report는 F 레코드 구문 (F가 더 엄격한 필드가없는 제공 선언되었는지 여부 합법,

식 F는 데이터 생성자 F을 {}로 지정 - 상기 제 탄환 참조); F ⊥1 ... ⊥n을 나타냅니다. 여기서 n은 F의 수식입니다.

괄호 안의 '네 번째 글 머리 기호'는 엄격한 구문을 사용하지 않고 레코드 구문으로 값을 구성하는 정적 오류입니다 들.

그리고 pattern matching 섹션에서

은 패턴 문법 규칙 중 하나는

apat -> qcon { fpat1 , … , fpatk }  (labeled pattern, k ≥ 0) 

이고 의미는

으로 패턴 매칭 (3.17.3)의 형식적 의미론의 항에서 주어진다
(o) case v of { K {} -> e ; _ -> e′ } 
     = case v of { 
      K _… _ -> e ; _ -> e′ } 
+3

이 구문은 유용합니다. 왜냐하면 생성자 'A'에 대한 인수의 개수가 변경 되더라도 함수 정의를 변경할 필요가 없기 때문입니다. 정규 패턴 매칭 (예 :'_ _ _ -> ...')을 사용하는 경우에는 그렇지 않습니다. –

+0

@ 대니얼 - 그렇지만이 경우 우리는 표현이 아니라 패턴을 사용합니다. 나는'F {}'가'F _1 _2 ... _n'과 동일해야한다고 생각합니다. 여기서 * n *은 생성자의 속성입니다. – Ingo

+0

@Ingo Right. 어제 밤 '비공식적 인 의미론'섹션을 보았지만 아무 것도 찾지 못했지만 표현 부분이 두드러졌습니다. 몇 시간의 수면 후에 공식 의미론 섹션에서 발견했습니다. –

관련 문제