문제

나는 스위치 문과 패턴 매칭 (F#)의 차이점을 두 사람과 설명하려고 노력했지만 실제로 잘 설명 할 수 없었습니다. 대부분의 시간은 저를보고 "So"라고 말합니다. 당신은 그냥 .. then..else "를 사용하지 마십시오.

그들에게 어떻게 설명 하시겠습니까?

편집하다! 위대한 답변에 감사드립니다. 여러 정답을 표시 할 수 있기를 바랍니다.

도움이 되었습니까?

해결책

이전에 "그 사람들"중 하나였던 나는 왜 패턴 매칭이 왜 그렇게 맛있는지를 요약하는 간결한 방법이 있다는 것을 모르겠습니다. 경험적입니다.

패턴 매칭을 방금 보았고 그것이 영광스러운 스위치 진술이라고 생각했을 때, 나는 대수 데이터 유형 (튜플 및 차별화 된 노조)으로 프로그래밍을 경험하지 않았다고 생각하고 패턴 일치가 둘 다라는 것을 알지 못했다고 생각합니다. 제어 구성 그리고 바인딩 구성. 이제 F#로 프로그래밍을 해왔으므로 마침내 "Get It". 패턴 매칭의 냉각은 기능 프로그래밍 언어에서 발견되는 기능의 합류로 인한 것이므로 외부인이 이해하는 것은 사소한 일입니다.

Language 및 API 디자인에 대한 짧은 두 부분으로 구성된 블로그 시리즈의 두 번째로 유용한 이유 중 하나를 요약하려고 노력했습니다. 체크 아웃 1 부 그리고 두 번째 부분.

다른 팁

패턴은 일치하려는 값의 구조를 설명하기 위해 작은 언어를 제공합니다. 구조는 임의로 깊을 수 있으며 변수를 구조화 된 값의 일부에 바인딩 할 수 있습니다.

이것은 당신이 매우 간결하게 글을 쓸 수있게합니다. 간단한 유형의 수학적 표현식에 대한 파생 기능과 같은 작은 예제로 이것을 설명 할 수 있습니다.

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) 매우 효율적인 구현 (점프 등). ).

발췌 이 블로그 기사:

패턴 매칭에는 스위치 문 및 메소드 파견보다 몇 가지 장점이 있습니다.

  • 패턴 일치는 ints, floats, strings 및 기타 유형 및 객체에 작용할 수 있습니다.
  • 패턴 일치는 여러 다른 값으로 동시에 동시에 작용할 수 있습니다 : 병렬 패턴 매칭. 메소드 디스패치 및 스위치는 단일 값 (예 : "this"로 제한됩니다.
  • 패턴을 중첩하여 임의의 깊이의 나무 위로 파견 할 수 있습니다. 메소드 디스패치 및 스위치는 네 가지 비 네스트 케이스로 제한됩니다.
  • 또는 패턴을 사용하면 서브 패턴을 공유 할 수 있습니다. 메소드 디스패치는 기본 클래스를 공유하는 클래스의 메소드 일 때만 공유 할 수 있습니다. 그렇지 않으면 공통성을 별도의 함수로 수동으로 고려한 다음 (이름을 부여) 모든 적절한 장소에서 불필요한 기능으로 호출을 수동으로 삽입해야합니다.
  • 패턴 매칭은 오류를 잡는 중복 검사를 제공합니다.
  • 중첩 및/또는 병렬 패턴 일치는 F# 컴파일러에서 최적화됩니다. OO 등가는 손으로 작성되고 개발 중에 손으로 끊임없이 다시 최적화되어야하며, 이는 엄청나게 지루하고 오류가 발생하기 쉽기 때문에 생산 품질 OO 코드는 비교할 때 매우 느린 경향이 있습니다.
  • 활성 패턴을 사용하면 사용자 정의 디스패치 의미를 주입 할 수 있습니다.

내 머리 꼭대기에서 :

  1. 컴파일러는 경기에서 모든 가능성을 다루지 않았는지 알 수 있습니다.
  2. 경기를 과제로 사용할 수 있습니다
  3. 차별적 인 노조가있는 경우 각 경기는 다른 '유형'을 가질 수 있습니다.

스위치는 두 개의 앞 바퀴입니다.

패턴 매칭은 전체 자동차입니다.

튜플은 ",", 변형에는 ctor args가 있습니다. 이것들은 생성자이며 물건을 만듭니다.

패턴은 소멸자이며, 그것들을 찢어 버립니다.

그것들은 이중 개념입니다.

이것을보다 강력하게 말하기 위해 : 튜플 또는 변형의 개념은 단지 그 생성자로만 설명 할 수 없습니다. 소멸자가 필요하거나 당신이 만든 가치는 쓸모가 없습니다. 값을 정의하는 것은 이러한 이중 설명입니다.

일반적으로 우리는 생성자를 데이터로 생각하고 소멸자는 제어 흐름으로 생각합니다. 변형 파괴자는 대체 분기 (많은 것 중 하나)이며 튜플 소멸자는 평행 실 (모두 많은)입니다.

병렬성은 운영에서 분명합니다

(f * g) . (h * k) = (f . h * g . k) 

함수를 통해 컨트롤이 흐르는 것을 생각하면 튜플은 계산을 병렬 제어 스레드로 분할하는 방법을 제공합니다.

이런 식으로 살펴보면, 표현식은 복잡한 데이터 구조를 만들기 위해 튜플과 변형을 구성하는 방법입니다 (AST 생각).

그리고 패턴 일치는 파괴자를 구성하는 방법입니다 (다시, AST를 생각하십시오).

OCAML의 패턴 일치는 위에서 설명한 여러 가지 방법으로 언급 된 바와 같이 더 표현력이 뛰어나고 매우 중요한 정적 보증을 제공합니다. 컴파일러는 패턴 일치 문에 의해 구현 된 사례 분석이 다음과 같습니다.

  • 철저한 (사례 없음)
  • 비 중복 (이전 사건에 의해 선점되기 때문에 결코 맞지 않을 수있는 사례 없음)
  • 소리 (문제의 데이터 유형을 감안할 때 불가능한 패턴 없음)

이것은 정말 큰 문제입니다. 처음으로 프로그램을 작성할 때 도움이되며 프로그램이 진화 할 때 엄청나게 유용합니다. 적절하게 사용하면 매치 성분을 사용하면 Code의 유형을 쉽게 변경할 수 있습니다. 유형 시스템은 깨진 매치 명령문을 가리키기 때문에 수정 해야하는 코드가있는 곳의 괜찮은 표시기입니다.

if-else (또는 스위치) 문은에 따라 값 (입력)을 처리하는 다른 방법을 선택하는 것입니다 속성 당면한 가치의.

패턴 일치는 주어진 값을 처리하는 방법을 정의하는 것입니다. 구조, (단일 케이스 패턴 일치가 의미가 있음)에 유의하십시오).

따라서 패턴 매칭은 선택을하는 것보다 값을 해체하는 것에 관한 것입니다. 이것은 OCAML 등과 같은 언어에 너무 풍부하게 사용되는 이유를 설명하는 유도 구조 (재귀 조합 유형)에서 (재귀 조합 유형) 기능을 정의하기위한 매우 편리한 메커니즘으로 만듭니다.

추신 : 수학에서의 임시 사용에서 패턴 매치 및 IF-ELSE "패턴"을 알 수 있습니다.

"X가 속성을 가지고 있다면 a y else z"(if-else)

"P1..PN의 일부 용어는 .... X ..의 주요 분해

아마도 당신은 줄과 정규 표현식과 비유 할 수 있습니까? 당신은 설명합니다 무엇 당신은 찾고 있고 컴파일러가 알아 내도록 어떻게 그 자체로. 코드를 훨씬 간단하고 명확하게 만듭니다.

따로 : 패턴 매칭에 가장 유용한 것은 좋은 습관을 장려한다는 것입니다. 나는 코너 케이스를 다룬다 첫 번째, 그리고 모든 경우를 다루었는지 쉽게 확인할 수 있습니다.

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