형식의 튜플 목록 (string, int)
이 있습니다. 목록을 검색하고 다음과 같이 문자열 구성 요소가 매개 변수와 일치하는 튜플을 반환하려고합니다. let find_tuple string_name tuples_list =
튜플 목록에서 하나의 항목과 일치합니다.
어떻게하면됩니까? 나는 그것의 주위에 나의 머리를 확실히 감쌀 수 없다. (string, _) ->...
과 같은 구문을 사용할 수 있습니까?
형식의 튜플 목록 (string, int)
이 있습니다. 목록을 검색하고 다음과 같이 문자열 구성 요소가 매개 변수와 일치하는 튜플을 반환하려고합니다. let find_tuple string_name tuples_list =
튜플 목록에서 하나의 항목과 일치합니다.
어떻게하면됩니까? 나는 그것의 주위에 나의 머리를 확실히 감쌀 수 없다. (string, _) ->...
과 같은 구문을 사용할 수 있습니까?
당신은
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
예,이 같은 구문을 일치 사용 하는가를 다음과 같이이를 달성 할 수 있지만, 경기 가드가 필요합니다 (또는 다른 다음 경우 사용할 수 있습니다) . 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
)는 않는다. 튜플의 값을 원하면 재 작성하거나 첫 번째 방법을 사용하십시오.
'as' 키워드를 사용하면 좀 더 단순하게 할 수 있습니다 :'| ((s, i) h) :: tl -> if ... then h else ...'또한 fst 함수에 대해서 알지 못했다. –
두 번째 옵션은 OP가 원했던'(string, _) '을 가진'List.find (fun (string, _) -> string = string_name) tuples_list'로 쓰여질 수도 있습니다. – sepp2k
감사! 'let rec'로 완벽하게 작동했습니다. – yavoh