我使用Janestreet的Core并且我基本上想做String.map str (Char.to_int)
,但是String.map需要函数be(char - > char)并返回一个字符串(不是列表)如所须)。我所知道的替代方法是使用for循环并列出一个列表,但这并不是很糟糕。是否有一个带字符串的地图和一个(char - >' a)并返回一个'列表?
答案 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);;
这应该可以作为嵌套函数来完成。