OCaml:需要List.map函数的帮助

时间:2013-12-09 18:00:04

标签: string list ocaml

我需要创建一个基本上像这样工作的函数:

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!,所以请随意假设我绝对无知。

2 个答案:

答案 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的下一个字符。结果应该是您将新字符添加到目前为止的列表时得到的结果。

最后,您需要将字符列表转换回字符串。