首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在F#列表中加倍元素并在新列表中设置它们

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

Stack Overflow用户
提问于 2017-03-22 18:18:30
回答 1查看 491关注 0票数 1

一般来说,我对F#和函数式编程非常陌生,我希望递归地创建一个函数,该函数接受一个列表,并将所有元素加倍。

这是我曾经搜索的一个spacific元素,但我不确定如何才能确切地更改它以满足我的需要。

代码语言:javascript
复制
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 )

有什么办法让我增加这个能力去做我需要做的事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-22 20:04:48

我想带你经历一下思考的过程。

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

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

代码语言:javascript
复制
let rec doubleAll list = 
    match list with
    | []       -> []
    | hd :: tl -> hd * 2 :: doubleAll tl

希望这个逻辑非常简单:

如果有空列表,则返回另一个空列表。

如果我们有一个至少有一个元素的列表,那么我们将这个元素加倍,然后将其放在列表尾部调用doubleAll函数的结果前面。

步骤2.实际上,这里发生了两件事:

  1. 我想要一个函数,它允许我将另一个函数应用到列表的每个元素上。
  2. 在这种情况下,我希望这个函数是“乘以2”。

所以,现在我们有两个函数,让我们来做一个简单的实现,如下所示:

代码语言:javascript
复制
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

所以,我们要做的就是:

代码语言:javascript
复制
let doubleAll list = List.map (fun x -> x * 2) list
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42959749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档