패턴 매칭 대 스위치 설명
저는 switch 문과 패턴 매칭 (F #)의 차이점을 몇 사람에게 설명하려고했지만 잘 설명 할 수 없었습니다. 대부분의 경우 그들은 저를보고 "그래서 왜 if..then..else "를 사용하지 마십시오.
그들에게 어떻게 설명 하시겠습니까?
편집하다! 훌륭한 답변에 감사드립니다. 여러 개의 정답을 표시 할 수 있었으면합니다.
이전에는 "그런 사람들"중 하나 였지만, 패턴 매칭이 왜 그렇게 맛있는 장점이 있는지 요약 할 수있는 간결한 방법이 있는지 모르겠습니다. 경험적입니다.
방금 패턴 매칭을 훑어보고 그것이 영광스러운 switch 문이라고 생각했을 때, 나는 대수 데이터 유형 (튜플과 구별 된 유니온)을 사용한 프로그래밍 경험이 없었고 패턴 매칭이 둘 다라는 것을 알지 못했다고 생각합니다. 제어 구조 및 결합 구조. 이제 F #으로 프로그래밍 했으므로 드디어 "알겠습니다". 패턴 매칭의 멋짐은 함수형 프로그래밍 언어에서 발견되는 기능의 합류로 인한 것이므로 외부인이 감상하는 것은 사소한 일이 아닙니다.
나는 언어 및 API 디자인에 관한 짧은 2 부작 블로그 시리즈의 두 번째에서 패턴 일치가 유용한 이유에 대한 한 가지 측면을 요약하려고했습니다. 파트 1 과 파트 2를 확인하십시오 .
패턴은 일치하려는 값의 구조를 설명하는 작은 언어를 제공합니다. 구조는 임의로 깊을 수 있으며 구조화 된 값의 일부에 변수를 바인딩 할 수 있습니다.
이를 통해 매우 간결하게 작성할 수 있습니다. 간단한 유형의 수학 표현식에 대한 미분 함수와 같은 간단한 예제로이를 설명 할 수 있습니다.
type expr =
| Int of int
| Var of string
| Add of expr * expr
| Mul of expr * expr;;
let rec d(f, x) =
match f with
| Var y when x=y -> Int 1
| Int _ | Var _ -> Int 0
| Add(f, g) -> Add(d(f, x), d(g, x))
| Mul(f, g) -> Add(Mul(f, d(g, x)), Mul(g, d(f, x)));;
또한 패턴 일치는 정적 유형에 대한 정적 구조이기 때문에 컴파일러는 (i) 모든 사례를 다루 었는지 (ii) 어떤 값과도 일치하지 않는 중복 분기를 감지하고 (iii) 매우 효율적인 구현을 제공 (점프 등) 할 수 있습니다. ).
이 블로그 기사 에서 발췌 :
패턴 일치는 switch 문 및 메서드 디스패치에 비해 몇 가지 장점이 있습니다.
- 패턴 일치는 int, float, 문자열 및 기타 유형과 객체에 대해 작동 할 수 있습니다.
- 패턴 일치는 병렬 패턴 일치라는 여러 다른 값에 동시에 작용할 수 있습니다. 메소드 디스패치 및 전환은 "this"와 같은 단일 값으로 제한됩니다.
- 패턴을 중첩하여 임의 깊이의 트리를 전달할 수 있습니다. 메서드 디스패치 및 전환은 중첩되지 않은 경우로 제한됩니다.
- OR 패턴을 사용하면 하위 패턴을 공유 할 수 있습니다. 메서드 디스패치는 기본 클래스를 공유하는 클래스의 메서드 일 때만 공유를 허용합니다. 그렇지 않으면 공통성을 수동으로 분리하여 별도의 함수 (이름 제공)로 분리 한 다음 모든 적절한 위치에서 불필요한 함수로 호출을 수동으로 삽입해야합니다.
- 패턴 일치는 오류를 포착하는 중복 검사를 제공합니다.
- 중첩 및 / 또는 병렬 패턴 일치는 F # 컴파일러에 의해 최적화됩니다. OO에 해당하는 코드는 수작업으로 작성해야하며 개발 중에 지속적으로 수작업으로 재 최적화해야합니다. 이는 엄청나게 지루하고 오류가 발생하기 쉬우므로 생산 품질의 OO 코드는 비교에서 매우 느린 경향이 있습니다.
- 활성 패턴을 사용하면 사용자 지정 디스패치 의미 체계를 삽입 할 수 있습니다.
내 머리 위로 :
- 컴파일러는 경기에서 모든 가능성을 다루지 않았는지 알 수 있습니다.
- 매치를 과제로 사용할 수 있습니다.
- 구분 된 조합이있는 경우 각 일치는 다른 '유형'을 가질 수 있습니다.
스위치는 두 개의 앞바퀴입니다.
패턴 매칭은 전체 자동차입니다.
튜플에는 ","가 있고 Variants에는 Ctor args가 있습니다. 이들은 생성자이며 무언가를 만듭니다.
패턴은 소멸자이며 분리됩니다.
이중 개념입니다.
좀 더 강력하게 설명하자면 튜플이나 변형의 개념은 생성자로만 설명 할 수 없습니다. 소멸자가 필요하거나 만든 값이 쓸모가 없습니다. 값을 정의하는 것은 이러한 이중 설명입니다.
일반적으로 생성자는 데이터로, 소멸자는 제어 흐름으로 생각합니다. 변형 소멸자는 대체 분기 (여러 개 중 하나)이고, 튜플 소멸자는 병렬 스레드 (모두)입니다.
병렬 처리는 다음과 같은 작업에서 분명합니다.
(f * g) . (h * k) = (f . h * g . k)
함수를 통해 흐르는 제어를 생각한다면 튜플은 계산을 병렬 제어 스레드로 분할하는 방법을 제공합니다.
이런 식으로 보면 식은 복잡한 데이터 구조를 만들기 위해 튜플과 변형을 구성하는 방법입니다 (AST를 생각해보십시오).
그리고 패턴 일치는 소멸자를 구성하는 방법입니다 (다시 말하지만 AST를 생각해보십시오).
OCaml의 패턴 일치는 위에서 설명한 여러 가지 방식으로 언급 한 것처럼 표현력이 더 풍부 할뿐만 아니라 매우 중요한 정적 보장을 제공합니다. 컴파일러는 패턴 일치 문에 의해 구현 된 대 / 소문자 분석이 다음과 같음을 증명합니다.
- 철저 함 (사례 누락 없음)
- 중복되지 않음 (이전 사례가 선점했기 때문에 적중 할 수없는 사례 없음)
- 사운드 (문제의 데이터 유형이 주어지면 불가능한 패턴 없음)
이것은 정말 큰 일입니다. 처음으로 프로그램을 작성할 때 유용하며 프로그램이 발전 할 때 매우 유용합니다. 올바르게 사용하면 match-statements를 사용하면 코드의 유형을 안정적으로 쉽게 변경할 수 있습니다. 유형 시스템이 수정해야하는 코드가있는 위치를 나타내는 적절한 표시기 인 끊어진 일치 문을 가리 키기 때문입니다.
If-Else (or switch) statements are about choosing different ways to process a value (input) depending on properties of the value at hand.
Pattern matching is about defining how to process a value given its structure, (also note that single case pattern matches make sense).
Thus pattern matching is more about deconstructing values than making choices, this makes them a very convenient mechanism for defining (recursive) functions on inductive structures (recursive union types), which explains why they are so abundantly used in languages like Ocaml etc.
PS: You might know the pattern-match and If-Else "patterns" from their ad-hoc use in math;
"if x has property A then y else z" (If-Else)
"some term in p1..pn where .... is the prime decomposition of x.." ((single case) pattern match)
Perhaps you could draw an analogy with strings and regular expressions? You describe what you are looking for, and let the compiler figure out how for itself. It makes your code much simpler and clearer.
As an aside: I find that the most useful thing about pattern matching is that it encourages good habits. I deal with the corner cases first, and it's easy to check that I've covered every case.
ReferenceURL : https://stackoverflow.com/questions/199918/explaining-pattern-matching-vs-switch
'program story' 카테고리의 다른 글
Django REST Framework 사용자 정의 필드 유효성 검사 (0) | 2020.12.30 |
---|---|
PHP 세션 데이터가 저장되지 않음 (0) | 2020.12.30 |
불변성이란 무엇이며 왜 걱정해야합니까? (0) | 2020.12.30 |
GitHub 저장소 백업 (0) | 2020.12.30 |
python3.3에서 docx를 가져올 때 ImportError : No module named 'exceptions'오류가 있습니다. (0) | 2020.12.29 |