Ocaml 字符串上的映射(字符->;int)
我使用的是Janestreet的核心,基本上我想做Ocaml 字符串上的映射(字符->;int),ocaml,Ocaml,我使用的是Janestreet的核心,基本上我想做String.map str(Char.to_int),但是String.map需要函数be(Char->Char)并返回一个字符串(不是需要的列表)。我知道的另一种方法是使用for循环并创建一个列表,但这不是很简单。是否有一个映射,它接受一个字符串和一个(char->'a)并返回一个'a list?我在字符串模块的核心扩展中看到一个名为to_list\u rev的函数。它将一个字符串转换为一个反向的字符列表。所以,你可以这样做: List.re
String.map str(Char.to_int)
,但是String.map需要函数be(Char->Char)并返回一个字符串(不是需要的列表)。我知道的另一种方法是使用for循环并创建一个列表,但这不是很简单。是否有一个映射,它接受一个字符串和一个(char->'a)并返回一个'a list?我在字符串模块的核心扩展中看到一个名为to_list\u rev
的函数。它将一个字符串转换为一个反向的字符列表。所以,你可以这样做:
List.rev_map Char.to_int (String.to_list_rev s)
更新
在内核中,字符串似乎也是一个容器。指向容器的链接在文档中不起作用,但我认为这意味着有一个to_list
函数,使用起来更自然
因此,即使您不想走这条路线,此代码似乎比上面的代码更整洁:
List.map Char.to_int (String.to_list s)
像杰夫建议的那样写我自己的。应该是合理有效的
let rec str_map_helper str f acc ind =
if ind = -1
then acc
else str_map_helper str f ((f str.[ind])::acc) (ind - 1);;
let string_map str f =
str_map_helper str f [] ((String.length str) - 1);;
不过,这可能应该作为一个嵌套函数来完成。所有映射函数都返回相同的容器,但包含不同的元素。最简单的解决办法是:
String.to_list str |> List.map ~f:Char.to_int
这是一个非常普通的成语。当然,您可以使用rev_map
稍微加快速度:
String.to_list_rev str |> List.rev_map ~f:Char.to_int
另一个更麻烦的选项是在使用list.init
函数展开字符串的同时构建一个新列表:
let to_codes str =
List.init (String.length str) ~f:(fun n ->
Char.to_int str.[n])
嗯。。。我仍然希望得到一个更好的答案。我不怪你:-)Fwiw,只编写你想要的映射函数并不难。我最终接受了你的建议。@Romildo:谢谢你指出这一点。解决方案是让str\u map\u helper立即返回acc,如果ind=-1,我会编辑代码,但我当前的计算机没有OCaml。