在列表F#中替换元素递归

时间:2014-05-05 21:28:44

标签: recursion f#

我正在努力学习F#的基础知识,并想知道如何以递归方式替换列表中的元素。所以你会做这样的事情。

2 个答案:

答案 0 :(得分:4)

let replace index sub = List.mapi (fun i x -> if i = index then sub else x)

replace 0 'd' ['a';'b';'c'] 
> val it : char list = ['d'; 'b'; 'c']

这符合您的标准,只需进行两项小改动,使其更符合F#风格:

  1. 索引从零开始
  2. 列表是支持管道的最后一个参数

答案 1 :(得分:1)

我联系的答案的修改直接回答了问题:

let rec insert v i l = //v - value to substitute, i - index at which to substitute, l - the list
    match i, l with
    | 0, x::xs -> v::xs //this line does the actual replace
    | i, x::xs -> x::insert v (i - 1) xs //simply iterates one further through the list
    | i, [] -> failwith "index out of range" // the given index is outside the bounds of the list

请注意,这不是尾递归,而且Stackoverflow适用于大型列表。如果你需要进行这种类型的操作,数组或列表可能是更好的选择。