Фильтр списка затем Карта списка в OCaml - PullRequest
0 голосов
/ 12 сентября 2018

Как применить фильтр списка перед картой списка в OCaml? Я пробую трубного оператора, но безуспешно:

let r infile =
match List.tl (In_channel.read_lines infile ) with
| None -> []
| Some body ->
  List.filter body ~f:(fun line -> true)
  |> List.map body ~f:(fun line ->
    match split_on_comma line with
    | _ :: _ :: num :: street :: unit :: city :: _ :: region :: _ ->
      String.strip (num ^ " " ^ addr_case street ^ ", " ^ addr_case city ^ " " ^ region)
    | _ -> assert false)

Утоп дает мне:

"Это выражение имеет тип списка строк но ожидалось выражение типа строковый список -> 'a "

Я знаю, что List.filter в настоящее время ничего не делает. Я просто пытаюсь использовать его до List.map

1 Ответ

0 голосов
/ 12 сентября 2018

Стандартный OCaml List.filter не имеет параметра ~f:. Скорее всего, вы используете Core.

У меня сейчас нет Core, поэтому я не могу проверить. Но одна из возможных проблем заключается в том, что вы используете body в вызове List.map. Я думаю, вы должны оставить это. Вы хотите обработать результат выражения List.filter. Вы не хотите обрабатывать тело, которое является исходным значением из совпадения.

Вот аналогичное выражение, использующее версии функций стандартной библиотеки OCaml:

# ListLabels.filter [1; 2; 3; 4]
      ~f: (fun x -> x mod 2 = 0) |>
  ListLabels.map ~f: (fun x -> x + 10) ;;
- : int list = [12; 14]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...