【问题标题】:How to double elements in an F# list and set them in a new list如何将 F# 列表中的元素加倍并将它们设置在新列表中
【发布时间】:2017-08-15 01:05:28
【问题描述】:

我对 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 )

有没有办法让我增强它来做我需要做的事情?

【问题讨论】:

  • 提问时,您应该始终展示您是如何尝试解决问题的。就您的问题而言,您基本上只是要求某人为您解决问题。

标签: list function recursion f# functional-programming


【解决方案1】:

我想带你完成思考过程。

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

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

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

希望这个逻辑很简单:

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

如果我们有一个包含至少一个元素的列表,我们将元素加倍,然后将其添加到调用列表尾部的 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

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

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

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

【讨论】:

  • 谢谢!这为我清除了一切。感谢您花时间向我解释这一点,以便我了解这个过程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多