Ocaml:用于将列表的第一个元素大写的函数

Ocaml:用于将列表的第一个元素大写的函数,ocaml,Ocaml,我有以下功能(来自真实世界的Ocaml书籍)可以完美地工作(与核心库一起使用): 因此,当我评估: upcase_first_entry ("one,two");; 我得到: - : string = "ONE,two" 根据我对函数的理解,首先将字符串转换为字符串列表,然后应用大写函数,最后将输出转换回字符串。 因此,我尝试了以下功能: List.map ~f:(fun (first :: last) -> (String.uppercase first :: last)) ["on

我有以下功能(来自真实世界的Ocaml书籍)可以完美地工作(与核心库一起使用):

因此,当我评估:

upcase_first_entry ("one,two");;
我得到:

- : 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

有人能告诉我为什么会抛出错误吗?

直接在解释器中键入参数
[“一”,“二”]

- : (string * string) list = [("one", "two")]
也就是说,字符串对列表不是字符串列表。您可能想键入
[“一”;“两”]
,这是一个
字符串列表。在OCaml中,
用于生成对和其他元组,即使没有给出括号

下一个问题是
List.map
将函数应用于列表的每个元素并创建一个新列表。在这种情况下,它需要一个
f
字符串映射到某个对象。但是您的匿名函数将字符串列表映射到字符串列表(
string list->string list

在这种情况下,最简单的解决方案可能是不使用
List.map
,而只是将函数应用于参数

(fun (first :: last) -> (String.uppercase first :: last)) ["one";"two"]
由此产生的警告表示缺少案例。实际上,没有为空列表定义匿名函数。这对于给定的参数来说并不重要,但是,一般来说,最好定义应该发生什么,并且消除警告:

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