2010-12-17 5 views
8

형식의 튜플 목록 (string, int)이 있습니다. 목록을 검색하고 다음과 같이 문자열 구성 요소가 매개 변수와 일치하는 튜플을 반환하려고합니다. let find_tuple string_name tuples_list =튜플 목록에서 하나의 항목과 일치합니다.

어떻게하면됩니까? 나는 그것의 주위에 나의 머리를 확실히 감쌀 수 없다. (string, _) ->...과 같은 구문을 사용할 수 있습니까?

답변

7

당신은

let rec find_tuple string_name tuples_list = 
     match tuples_list with 
      [] -> raise Not_found 
      |(s, i)::tl -> if s = string_name then (s, i) 
            else find_tuple string_name tl 

하거나

List.find (fun s -> fst s = string_name) tuples_list 
+0

'as' 키워드를 사용하면 좀 더 단순하게 할 수 있습니다 :'| ((s, i) h) :: tl -> if ... then h else ...'또한 fst 함수에 대해서 알지 못했다. –

+1

두 번째 옵션은 OP가 원했던'(string, _) '을 가진'List.find (fun (string, _) -> string = string_name) tuples_list'로 쓰여질 수도 있습니다. – sepp2k

+0

감사! 'let rec'로 완벽하게 작동했습니다. – yavoh

1

예,이 같은 구문을 일치 사용 하는가를 다음과 같이이를 달성 할 수 있지만, 경기 가드가 필요합니다 (또는 다른 다음 경우 사용할 수 있습니다) . List 모듈에는 술어와 일치하는 첫 번째 요소를 리턴하는 find이라는 함수가 있습니다. 또한 술어와 일치하는 모든 요소 목록을 리턴하는 함수 filter (및 find_all - 동일한 기능)도 있습니다.

let predicate string_name tuple = match tuple with (s, _) when s = string_name -> true 
    | _ false 

try 
    let x = List.find (predicate "query") tuples_list in 
    ... 
    with Not_found -> ... 

편집 : 더 나은 조건 : 예를 들어

을 : 더 나은 솔루션은 튜플의리스트에서 작동 List.assoc를 사용하는 것입니다, 그리고 키 - 값 쌍으로 튜플을 고려 그러나

let predicate string_name (s, _) = s = string_name 

try 
    let x = List.assoc "query" tuples_list in ... 
with Not_found -> ... 

List.assoc의 반환 값 터플 번째 요소 (케이스의 int)는 않는다. 튜플의 값을 원하면 재 작성하거나 첫 번째 방법을 사용하십시오.