Ввод аргумента ["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"]