Vâng, bạn sử dụng phù hợp với cú pháp như thế, nhưng sẽ cần phải bảo vệ trận đấu (hoặc bạn có thể sử dụng nếu sau đó khác) . Mô-đun List
có chức năng gọi là find
sẽ trả về phần tử đầu tiên khớp với vị từ. Nó cũng có chức năng filter
(và find_all
- cùng chức năng) trả về danh sách tất cả các phần tử khớp với vị từ. Ví dụ:
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 -> ...
EDIT: một vị tốt hơn:
let predicate string_name (s, _) = s = string_name
Tuy nhiên, giải pháp tốt hơn là sử dụng List.assoc
mà hoạt động trên danh sách của các bộ, và xem xét các tuple được cặp khóa-giá trị:
try
let x = List.assoc "query" tuples_list in ...
with Not_found -> ...
Mặc dù giá trị trả lại là List.assoc
là phần tử thứ hai của bộ (int
trong trường hợp của bạn). Nếu bạn muốn giá trị của tuple, hoặc là tạo lại nó, hoặc sử dụng cách tiếp cận đầu tiên.
Nguồn
2010-12-17 17:40:45
Bạn có thể sử dụng từ khóa 'as' để đơn giản hóa mọi thứ một chút:' | ((s, i) là h) :: tl -> nếu ... thì h else ... 'Ngoài ra, không biết về hàm' fst', cảm ơn vì đã chỉ ra nó! –
Tùy chọn thứ hai cũng có thể được viết dưới dạng 'List.find (fun (string, _) -> string = string_name) tuples_list', có' (string, _) 'mà OP muốn. – sepp2k
Cảm ơn! Với một 'let rec' nó hoạt động hoàn hảo. – yavoh