Ocaml: функция для прописных букв первого элемента списка - PullRequest
0 голосов
/ 26 августа 2018

У меня есть следующая функция (из книги о реальном мире Ocaml), которая прекрасно работает (с библиотекой Core):

 let upcase_first_entry line =
  match String.split ~on:',' line with
  | [] -> assert false
  | first :: rest -> String.concat ~sep: "," (String.uppercase first :: rest);;

Поэтому, когда я оцениваю:

upcase_first_entry ("one,two");;

Iget:

- : string = "ONE,two"

Из моего понимания функции, строка сначала преобразуется в список строк, а затем применяется функция верхнего регистра и, наконец, вывод преобразуется обратно в строку.Поэтому я попробовал следующую функцию:

List.map ~f:(fun (first :: last) -> (String.uppercase first :: last)) ["one","two"];; 

, где я передаю функции список напрямую.Но я получаю следующую ошибку:

Error: This pattern matches values of type 'a list
       but a pattern was expected which matches values of type
         string * string

Может кто-нибудь подсказать мне, почему возникает ошибка?

1 Ответ

0 голосов
/ 26 августа 2018

Ввод аргумента ["one", "two"] непосредственно в интерпретаторе дает

- : (string * string) list = [("one", "two")]

То есть список пар строк , а не список строк. Вы, вероятно, хотели набрать ["one"; "two"], что является string list. В OCaml , используется для создания пар и других кортежей, даже если скобки не указаны.

Следующая проблема заключается в том, что List.map применяет функцию к каждому элементу списка и создает новый список. В этой ситуации он ожидает f, который сопоставляет string с чем-либо. Но ваша анонимная функция отображает список строк в список строк (string list -> string list).

В этом случае простейшим решением, вероятно, является не использование List.map, а просто применение вашей функции к аргументу.

(fun (first :: last) -> (String.uppercase first :: last)) ["one";"two"]

Полученное предупреждение указывает, что дело отсутствует. Действительно, анонимная функция не определена для пустого списка. Это не имеет значения для данного аргумента, но, в общем, было бы лучше определить, что должно произойти, и это избавляет от предупреждения:

(function (first :: last) -> (String.uppercase first :: last) | [] -> []) ["one";"two"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...