List F#-复制列表的递归函数

List F#-复制列表的递归函数,list,f#,List,F#,我编写此代码是为了递归复制我的列表: let sp = [2;4;6;8;10] let copy (s1:'a list) = let rec copy acc ind = if(ind>=0) then copy (s1.[ind]::acc) (ind-1) else acc copy [] (s1.Length-1) sp |> copy |> printfn "%A" 如何使此代码更简单?执行列表查找(以及获取列表长度)不是很有

我编写此代码是为了递归复制我的列表:

let sp = [2;4;6;8;10]
let copy (s1:'a list) =
let rec copy acc ind = 
    if(ind>=0) then
        copy (s1.[ind]::acc) (ind-1)
    else acc
copy [] (s1.Length-1)


sp |> copy |> printfn "%A"

如何使此代码更简单?

执行列表查找(以及获取列表长度)不是很有效,因为库需要迭代整个列表(或前N个元素)。因此,在F#中这样做并不是真正的习惯用法

您仍然可以保留代码的大部分结构,但可以对其进行如下更改:

let copy input =
  let rec copy acc input =
    match input with
    | [] -> List.rev acc
    | x::xs -> copy (x::acc) xs
  copy [] input
这些变化是:

  • 我们对输入使用模式匹配,并且总是得到第一个元素
  • 由于我们以相反的顺序将项目附加到
    acc
    ,因此我们调用
    List.rev
    以在末尾反转结果(这是处理列表时的标准技巧)

让它更像递归求和函数您所说的“更简单”到底是什么意思?更优化?更容易阅读?你必须解决一个练习或一个真正的问题?F#中的列表是不变的,所以(通常)没有理由复制它们。你想解决什么更大的问题?