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)
有没有办法让我增加这个来做我需要的东西?
我想带你完成思考过程.
步骤1.我需要一个递归函数,它接受一个列表并将所有元素加倍:
所以,让我们以一种天真的方式实现这一点:
let rec doubleAll list =
match list with
| [] -> []
| hd :: tl -> hd * 2 :: doubleAll tl
Run Code Online (Sandbox Code Playgroud)
希望这个逻辑非常简单:
如果我们有一个空列表,我们返回另一个空列表.
如果我们有一个至少包含一个元素的列表,我们将该元素加倍,然后将其添加到doubleAll在列表尾部调用函数的结果中.
第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)