我需要创建一个基本上像这样工作的函数:
insert_char("string" 'x') outputs "sxtxrxixnxg".
所以这是我的理由:
创建一个包含字符串中每个字符的列表:
let inserer_car(s, c) =
let l = ref [] in
for i = 0 to string.length(s) - 1 do
l := s.[i] :: !l
done;
然后,我想使用List.map
将其转换为['s', 'x', 't', 'x' etc.]
之类的列表。
但是,我真的不知道如何创建我的函数来使用map。任何帮助将不胜感激!
我是编程的初学者,尤其是 ocaml!,所以请随意假设我绝对无知。
答案 0 :(得分:1)
如果你使用的是Core,你可以这样写:
open Core.Std
let insert_char s c =
String.to_list s
|> (fun l -> List.intersperse l c)
|> String.of_char_list
或等同地:
let insert_char s c =
let chars = String.to_list s in
let interspersed_chars = List.intersperse chars c in
String.of_char_list interspersed_chars
这只是对现有图书馆的直接使用。如果您想要List.intersperse
的实施,您可以找到它here。这很简单。
答案 1 :(得分:0)
map函数创建具有不同内容的结构的副本。对于列表,这意味着List.map f list
的长度与list
相同。所以,这对你不起作用。你的问题需要一个折叠的全部力量。
(你也可以强制解决问题,但在我看来,研究OCaml的原因是要学习函数式编程。)
假设您要使用List.fold_left
。然后电话看起来像这样:
let result = List.fold_left myfun [] !l
您的函数myfun
的类型为char list -> char -> char list
。实质上,它的第一个参数是你到目前为止构建的结果,它的第二个参数是输入列表!l
的下一个字符。结果应该是您将新字符添加到目前为止的列表时得到的结果。
最后,您需要将字符列表转换回字符串。