如何在F#列表中加倍元素并将它们设置在新列表中

时间:2017-03-22 18:18:30

标签: list function recursion f# functional-programming

我对F#和函数式编程非常陌生,并希望以递归方式创建一个获取列表的函数,并将所有元素加倍。

这是我用来搜索空间元素的东西,但我不知道我究竟能如何改变它来做我需要的东西。

let rec returnN n theList =
    match n, theList with
    | 0, (head::_) -> head
    | _, (_::theList') -> returnN (n - 1) theList'
    | _, [] -> invalidArg "n" "n is larger then list length"

let list1 = [5; 10; 15; 20; 50; 25; 30]   
printfn "%d" (returnN 3 list1 )

有没有办法让我增加这个来做我需要的东西?

1 个答案:

答案 0 :(得分:8)

我想带你完成思考过程。

第1步。我需要一个递归函数,它接受一个列表并将所有元素加倍:

所以,让我们以一种天真的方式实现这一点:

let rec doubleAll list = 
    match list with
    | []       -> []
    | hd :: tl -> hd * 2 :: doubleAll tl

希望这个逻辑非常简单:

如果我们有一个空列表,我们会返回另一个空列表。

如果我们有一个包含至少一个元素的列表,我们将该元素加倍,然后将其添加到在列表尾部调用doubleAll函数的结果。

第2步。实际上,这里有两件事:

  1. 我想要一个允许我将另一个函数应用于列表的每个元素的函数。
  2. 在这种情况下,我希望该功能为"乘以2"。
  3. 所以,现在我们有两个功能,让我们做一个简单的实现:

    let rec map f list =
        match list with
        | []       -> []
        | hd :: tl -> f hd :: map f tl
    
    let doubleAll list = map (fun x -> x * 2) list
    

    第3步。实际上,map的想法是如此常见,它已经内置到F#标准库中,请参阅List.map

    所以,我们需要做的就是:

    let doubleAll list = List.map (fun x -> x * 2) list