2010-05-17 5 views
11

내가 (내가 조금 단순화)이 같은 패턴 매칭 건너 온 : 내가 마지막 경기가 머리를 인식하는지 이해 실질적으로이해 패턴은 "프로그래밍 F 번호"에서

let rec len list = 
    match list with 
    | [] -> 0 
    | [_] -> 1 
    | head :: tail -> 1 + len tail;; 

및 꼬리표. 개념적으로, 나는 그것이 효과가있는 이유를 알지 못한다. 내가 이해하는 한, :: cons 연산자는 목록의 머리 위치에 값을 추가하지만, 여기서 연산자로 사용되는 것처럼 보이지 않습니다. 이것은 목록에 대한 "특수 구문"으로 이해해야합니까? ::는 문맥에 따라 연산자 또는 "일치 패턴"으로 해석됩니까? 또는 목록 이외의 다른 연산자에 대해서도 동일한 아이디어를 확장 할 수 있습니까?

답변

10

브라이언의 답변 외에도 주목할 가치가있는 몇 가지 점이 있습니다. (실시 예 +위한) 다른 사업자가 분해 (패턴으로 사용할 수 없기 때문에,

let l = 1::2::[]     // As an operator 
match l with x::xs -> 1 | [] -> 0 // As a pattern 

이 그것을 조금 특별한 구조임을 의미 다음 h::t 구문 패턴으로 오퍼레이터 로서 모두 사용될 수있다 결과는 연산자의 인수로 돌아 간다.) 분명히 +의 경우 이것은 모호 할 것이다.

또한 패턴이 중첩 된 패턴이므로 패턴 [_]이 흥미 롭습니다. 그것은 작곡 :

  • _ - 하나의 요소가있는 목록과 일치리스트의 요소를 일치하는 단일 요소 목록 패턴, - 어떤 값과 일치하고 문자를
  • [ <pattern> ] 결합하지 않는 패턴을 밑줄 중첩 된 <pattern>.

또한 match 1::[] with | [x] -> x을 작성하면 단일 요소 (이 경우 1)의 값을 반환 할 수 있습니다.

+0

고맙습니다. 당신의 요지에 대해서 : 특별한 구조를 갖추는 것이 정확히 내가 명확하지 않은 부분입니다. 나는 "같은"방법으로 패턴 매칭을하는 다른 연산자를 사용하려고 시도했지만,별로 의미가 없으며 어디에도 없습니다. 이것이 제가 단점에 대해 궁금해하는 이유입니다. – Mathias

+1

튜플에 대해서도 마찬가지입니다. (() 패턴을 사용하여 튜플을 빌드하고 언 패킹 할 수 있으며 다른 유형 (Some()/None)도 가능합니다. – Benjol

+0

다음은 [모두 지원되는 패턴 유형] (https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/pattern-matching)을 참조하십시오. – JanDotNet

13

목록의 특수 구문입니다. 당신은 thusly 히 차별 조합과 list 유형을 생각할 수 :

type list<'T> =   // ' 
    | Nil 
    | Cons of 'T * list<'T> 

것을 제외하고 Nil[]Cons(h,t)h::t을 할 수있게 특수 구문이있다. 그렇다면 차별화 된 노동 조합에 대한 일반적인 패턴 일치 일뿐입니다. 그게 도움이 되니?

(아마도 또한 this blog entry 참조). 세 패턴

+0

매우 도움이됩니다. 감사합니다. – Mathias

2

그것이 포매터로 사용 또는 공식적 pattern은`리스트 '일치 :

[]리스트가 비어 수단

[_]는 목록에 하나의 요소가 있음을 의미합니다. 요소가 무엇인지 신경 쓰지 않으므로 _을 그냥두면 [a]를 사용할 수도 있습니다.

head :: tail은 목록에 두 부분 즉, 머리와 꼬리가 있음을 의미합니다.

F # 패턴 일치를 if then else 구조로 볼 수 있습니다.