2015-01-25 2 views
0

트리플 (d, k, l)을 취하는 함수 rec assoc (d, k, l)을 생성해야합니다. 여기서 l은 키 - 값 쌍의리스트입니다 [ (k1, v1); (k2, v2); ...] 그리고 k와 동일한 첫번째 ki를 찾는다. 그러한 ki가 발견되면 vi가 리턴됩니다. 그렇지 않으면, 기본값 d가 리턴됩니다. 그것은 여기에 내가 만든 기능이 OCaml에서리스트의 튜플과 일치해야 함

재귀 꼬리를 할 필요가 :

let rec assoc (d,k,l) = match l with 
    |[]-> d 
    |(a,b)::t -> 
    if (a==k) then b 
    else assoc(d,k,t) 
;; 

내 논리가 여기 목록에서 튜플의 첫 번째 부분은 K 일치하는 경우 목록 리터의 머리를 가지고있다, 튜플의 두 번째 부분을 반환합니다. 그렇다면 각 요소를 검사 할 수 있도록 목록의 끝에 함수를 다시 호출하고 싶습니다. 일치하는 항목을 찾지 않고 목록 전체를 빈 목록으로 이동하면 d를 반환하고 싶습니다. 웬일인지, 나는 그것이 나에게 어떤 목록을 건든 상관없이 항상 d를 반환한다. 그 이유는 무엇 일 수 있습니다.

는 heres는 일부 샘플 출력은 제공해야합니다 :

# assoc (-1,"jeff",[("sorin",85);("jeff",23);("moose",44)]);; 
- : int = 23 
# assoc (-1,"bob",[("sorin",85);("jeff",23);("moose",44)("margaret",99)]);; 
- : int = -1 

내 -1을 반환 모두

+0

일반적으로 OCaml 프로그래머는 사용자가 가진 튜플의 모든 인수를 전달하지 않는다. 에서와 같이, 'rec assoc dk = function'을 선택하십시오. – nlucaroni

답변

3

에 대한 비교를 ==를 사용하지 마십시오을. 그것은 특수 목적의 "육체 평등"입니다. 비교를 위해 =을 사용하십시오.

(이 코드 이외에 우수한 보인다.)

비교 연산자는 Pervasives module에 정의되어 있습니다. E1 및 E2의 구조 어떤지

의 E1 = E2의 시험 : 여기 = (통상 동등 비교) 및 == (물리적 동등 비교 예)에 대한 설명이다. 두 개의 변경 가능한 객체가 동일한 물리적 객체가 아니더라도 변경 가능한 구조 (예 : 참조 및 배열)는 현재 내용이 구조적으로 동일 할 경우에만 동일합니다. 함수 값 간의 동일성은 Invalid_argument를 발생시킵니다. 순환 데이터 구조 간의 동등성은 종료되지 않을 수 있습니다.

e1 == e2는 e1과 e2의 물리적 평등을 테스트합니다. 참조, 배열, 바이트 시퀀스, 변경 가능한 필드가있는 레코드 및 변경 가능한 인스턴스 변수가있는 객체와 같은 변경 가능한 유형에서 e1의 물리적 수정이 e2에도 영향을주는 경우에만 e1 == e2가 true입니다. 비 변경 가능 유형에서 (==)의 동작은 구현에 따라 다릅니다. 그러나, E1 == E2는 =

0 일반적으로 당신이 특정이 (약한) 평등 테스트가 여기에 설명 원하지 않는다면, 당신은 당신의 코드에서 ==를 사용해서는 안 말하기 E1의 E2 비교 의미하는 것이 보장된다. 아니면 그냥 사용하지 마라 :-)

+0

내 코드가 수정되었습니다. 그러나 왜 내가 = 대신에 ==를 사용해야하는지에 대해 혼란 스럽습니다. 당신은 그것을 설명 할 수 있습니까? 나는 ==를 사용하여 비교하고 = 값을 설정해야한다고 생각했습니다. –

+0

이것들은 C와 다른 모든 언어의 C :-)에 대한 규칙이지만 OCaml의 규칙은 아닙니다. 나는'='과'=='에 대한 몇 가지 세부 사항을 추가했다. –

+1

또한 다형 비교 연산자'='는 집합과 같은 추상 데이터 구조를 비교하는 데는 적합하지 않습니다. 왜냐하면'='는 두 개의 피연산자의 표현을 단순히 비교하기 때문입니다. 이는 추상적 인 데이터 구조의 경우에는 부적합합니다. 엄지 손가락의 좋은 규칙은 '='을 콘크리트 유형에만 사용하는 것입니다. –

관련 문제