在String上映射(char - > int)

时间:2015-04-06 03:50:02

标签: ocaml

我使用Janestreet的Core并且我基本上想做String.map str (Char.to_int),但是String.map需要函数be(char - > char)并返回一个字符串(不是列表)如所须)。我所知道的替代方法是使用for循环并列出一个列表,但这并不是很糟糕。是否有一个带字符串的地图和一个(char - >' a)并返回一个'列表?

3 个答案:

答案 0 :(得分:1)

我在Core模块的Core扩展中看到一个名为to_list_rev的函数。它将字符串转换为反向的字符列表。所以,你可以这样做:

List.rev_map Char.to_int (String.to_list_rev s)

<强>更新

看来在Core中,String也是一个Container。 Container的链接不在文档中工作,但我认为这意味着有to_list函数,感觉更自然。

所以,即使你不想走这条路,这段代码似乎比上面更整洁:

List.map Char.to_int (String.to_list s)

答案 1 :(得分:1)

所有map函数都返回相同的容器,但具有不同的元素。最简单的解决方案是:

  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])

答案 2 :(得分:0)

像杰夫建议的那样写下我自己。应该合理有效。

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);;

这应该可以作为嵌套函数来完成。