2014-10-15 3 views
2

I 숫자 여러 커플로 구성된 목록을 가지고를 OCaml :리스트의 첫 번째 요소를 제거

[(1,2);(3,4);(5,6);(7,8)] 

I 목록에서 첫 번째 요소 (머리)를 제거 할 것인지, 그래서 출력해야 be :

[(3,4);(5,6);(7,8)] 

누군가가 나를 도와 줄 수 있습니까? 나는이 기능에 대해 생각했다하지만 작동하지 않습니다

let cut x = function 
[] -> [] 
| (a,b) -> [] 
| (a,b)::ris -> ris 

답변

1

당신은 간단하게 쓸 수있다 : 당신은 작은 실수가

let cut = List.tl 

. 세 번째 라인은

| [(a,b)] -> [] 

또는

| (a,b) :: [] -> [] 

P.S.과 같아야합니다 그건 그렇고,이 세 번째 라인은 불필요합니다. 그냥 제거하십시오. 첫 번째 줄에 그리고 삭제 x :

let cut = function 
1

당신은 거의 다 있습니다

let tl x = match x with 
    | [] -> [] (* or failwith "empty" *) 
    | ab::ris -> ris 

몇 가지 포인트 :

  • function 다른 인수를합니다. 함수가 이미 하나의 arg를 얻었으므로 대신 match x with을 사용하십시오.
  • 목록이 비어 있거나 "꼬리"가있는 경우에만 관심이 있습니다. 따라서 요소를 튜플로 패턴 일치시킬 필요가 없습니다.
  • 이 함수는 List.tl으로 알려진 OCaml에서 "꼬리"라고합니다.
0

그냥

let f x y = function -> <code> 

정말 바로 가기 (또는 문법 설탕)이라고 기억 : 그래서

let f x y z = match z with -> <code> 

, 그냥 함수의 마지막 인수를 인하하고, 자동으로 일치합니다.

또한 패턴 매칭을 염두에두면 패턴 일치의 왼쪽에있는 모든 표현식이 동일한 유형이어야합니다. 그렇지 않으면, 컴파일러는 임의의 것을 고르고, 다른 모든 것이 같은 타입을 가지고, 다소 혼란스러운 에러 메시지를내는 것을 결정할 수있다. 매치 매치의 오른쪽 면도 마찬가지입니다. 당신이 컴파일러 메시지를 볼 때, 그 무언가를 말하는 것은 바로이 전제 조건을 확인, 그가 기대 한 것이 아니다 :

| []     (* is a list, by definition *) 
| (a,b) -> []  (* is a pair, by definition of a pair *) 
| (a,b)::ris -> ris (* is a list, by definition of (::) *) 

왼쪽 작동하면 오른쪽에 보인다.

또한 사용할 필요가없는 변수가있는 경우 밑줄 또는 밑줄로 시작하는 이름을 지정하는 것이 좋습니다.

let cut = function 
    | [] -> [] 
    | _::xs -> xs 
관련 문제