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

use*_*295 1 recursion f# functional-programming function list

我对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 )
Run Code Online (Sandbox Code Playgroud)

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

The*_*ght 8

我想带你完成思考过程.

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

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

let rec doubleAll list = 
    match list with
    | []       -> []
    | hd :: tl -> hd * 2 :: doubleAll tl
Run Code Online (Sandbox Code Playgroud)

希望这个逻辑非常简单:

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

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

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

  1. 我想要一个允许我将另一个函数应用于列表的每个元素的函数.
  2. 在这种情况下,我希望该函数"乘以2".

所以,现在我们有两个函数,让我们做一个这样的简单实现:

let rec map f list =
    match list with
    | []       -> []
    | hd :: tl -> f hd :: map f tl

let doubleAll list = map (fun x -> x * 2) list
Run Code Online (Sandbox Code Playgroud)

第3步.实际上,这个想法map很常见,它已经内置到F#标准库中,请参阅List.map

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

let doubleAll list = List.map (fun x -> x * 2) list
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!这为我解决了问题.我感谢你花时间向我解释这一点,以便我能理解这个过程. (3认同)