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