2017-02-11 6 views
0

Я пытаюсь написать функцию, которая будет анализировать список и создать новый список, содержащий слова, которые я хочу в именах этого случая.Операторы Ocaml в анонимных функциях

Я предписание функции для одного имени например

let extract_name (lst : string list) : string list = 
List.filter (fun x -> x = "George") (lst) 

Когда я пытаюсь писать более одного имени, которое я получаю сообщение об ошибке. Несколько раз я скорректировал круглые скобки, но я все еще получаю ошибки.

let extract_name (lst : string list) : string list = 
List.filter (fun x -> x = ("George" || "Victoria")) (lst) 

Ошибки

let extract_name (lst : string list) : string list = 
List.filter (fun x -> x = "George" || "Victoria") (lst) 
;; 
Characters 93-103: 
List.filter (fun x -> x = "George" || "Victoria") (lst) 
             ^^^^^^^^^^ 
Error: This expression has type string but an expression was expecte of type bool 
# let extract_name (lst : string list) : string list = 
List.filter (fun x -> x = ("George" || "Victoria")) (lst);; 
Characters 82-90: 
List.filter (fun x -> x = ("George" || "Victoria")) (lst);; 
          ^^^^^^^^ 
Error: This expression has type string but an expression was expected  of type bool 

Как решить эту проблему?

ответ

3

Здесь вы пытаетесь применить оператор boolean || на две строки, что не работает и вызывает ошибку типа. Вам необходимо проверить равенство с x для обеих строк отдельно, а затем OR результат:

List.filter (fun x -> (x = "George") || (x = "Victoria")) lst 
+0

что, если вы хотите, чтобы сравнить его значения в списке? – Tank

+0

Затем используйте что-то вроде ['fun x -> List.mem x [" George "," Victoria "]'] (https://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html #VALmem) – Bergi