Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ocaml 字符串上的映射(字符->;int)_Ocaml - Fatal编程技术网

Ocaml 字符串上的映射(字符->;int)

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

我使用的是Janestreet的核心,基本上我想做
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。