【问题标题】:OCaml : need help for List.map functionOCaml:需要 List.map 功能的帮助
【发布时间】:2013-12-10 10:08:41
【问题描述】:

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

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.] 这样的列表。

但是,我真的不知道如何创建与地图一起使用的函数。任何帮助将不胜感激!

我是编程初学者,尤其是 ocaml! 所以请随意假设我完全无知。

【问题讨论】:

    标签: string list ocaml


    【解决方案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。这很简单。

    【讨论】:

      【解决方案2】:

      map 函数创建具有不同内容的结构的副本。对于列表,这意味着List.map f listlist 具有相同的长度。所以,这对你不起作用。你的问题需要弃牌的全部力量。

      (你也可以通过命令方式解决这个问题,但我认为学习 OCaml 的原因是学习函数式编程。)

      假设您将使用List.fold_left。然后调用看起来像这样:

      let result = List.fold_left myfun [] !l
      

      您的函数myfun 的类型为char list -> char -> char list。本质上,它的第一个参数是您目前构建的结果,它的第二个参数是输入列表!l 的下一个字符。结果应该是您将新角色添加到目前为止的列表中所得到的结果。

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

      【讨论】:

      • 谢谢,你能给我一个正确的 myfun 函数的基本例子吗?我不太确定语法。
      • 一个接受两个参数的函数:let f a b = b :: a.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-07
      相关资源
      最近更新 更多