2017-12-24 6 views
2

Ocaml과 함수 언어를 일반적으로 배우려고 시도하면서 패턴 일치를 조사했습니다. this documentation을 읽고 나서 다음 연습을 직접 해보기로 결정했습니다."사각형"튜플에 대한 Ocaml 패턴 일치?

4-tuple의 각 요소가 동일하도록 정수 4- 튜플이 입력되면 true으로 평가되는 식을 만듭니다.

(4, 4, 4, 4) ->true

(4, 2, 4, 4) -> I 찾을 false

그 값의 특이성에 대해 패턴 매칭을 수행 요소는 분명하지 않습니다. 이것이 제가 작성한 코드입니다.

Error: Variable a is bound several times in this matching

어떻게 다른 난 단지도 엄격 동일한 정수 x가 4 튜플 적용 할 수는 없지만 : 물론

let sqr x = match x with 
    (a, a, a, a) -> true 
| (_, _, _, _) -> false ;; 

,이 코드는 다음과 같은 오류가 발생합니다?

(물론 "정사각형"튜플은 양의 정수가 허용되어서는 안되지만, 지금 당장의 문제와 관련이 있습니다). `

+2

OCaml에는 각 변수가 한 번 나타나서 소위 "선형"패턴 만 있습니다. 패턴은 매칭 값의 다른 부분간에 동일성을 적용 할 수 없습니다. –

+1

또한 다음과 같이 함수 인수를 패턴 매치 할 수 있습니다 : let sqr (a, b, c, d) = a = b && b = c && c == d'''' 더 자연스러운 것처럼 보일 수도 있습니다 – ghilesZ

답변

6

다른 언어의 패턴 매칭 시스템과는 달리, OCaml에서는 이것을 할 수 없습니다.

let sqr x = 
    match x with 
    | (a, b, c, d) when a = b && b = c && c = d -> `Equal 
    | (a, b, c, d) when (a < b && b < c && c < d) 
        || (a > b && b > c && c > d) -> `Ordered 
    | _ -> `Boring 
+0

흥미 롭습니다. 나는 전체적으로 함수형 프로그래밍에 익숙하지 않다. Ocaml은 타입 유추를 알고 있지만, 프로그램에서''a'' 또는''int''의 튜플을 허용합니까? 또한, '평등'과 '명령'은 ... 무엇입니까? 감사! – TrueAzure

+2

@TrueAzure OCaml에서 다형성 인 비교 연산자 만 사용되기 때문에 'sqr'은 임의의 (단일) 유형의 튜플을 허용합니다. '\ '평등'과 친구들은 [다형성 변이 형] (https://caml.inria.fr/pub/docs/manual-ocaml-4.06/lablexamples.html#sec46) –

0

당신은 패턴 매칭을 할 수있는 많은 방법이, 패턴 매칭이되지 않습니다 : 당신이 할 수있는 것은 (등가 같은) 어떤 특성들을 통해 보유하고있는 경우에만 성공 가드를 사용하는 동안 별도로 튜플의 각 요소를 일치입니다 단지 경기 키워드 여기

let fourtuple_equals (a,b,c,d) = List.for_all ((=) a) [b;c;d] 
val fourtuple_equals : 'a * 'a * 'a * 'a -> bool = <fun> 

당신이 당신의 네 가지 요소 튜플에 액세스하기 위해 매개 변수에 직접 일치하는 패턴이를 사용하는 경우.

이 예제에서는 목록을 사용하여보다 간결한 코드를 만들었지 만 더 효율적은 아닙니다.