F# 我如何编写一个函数,它接受一个序列,并返回同一个序列,并且映射只应用于一个元素?

F# 我如何编写一个函数,它接受一个序列,并返回同一个序列,并且映射只应用于一个元素?,f#,F#,假设我有序列{1;2;3;4},我想对第三个元素应用(funx->x*2),产生{1;2;6;4}。构建这样一个函数的最佳方法是什么?一个简单的方法是这样做,同时仍然将seq视为一个流: let input = seq {1..4} let result = input |> Seq.mapi (fun i x -> match i with | 2 (* 3rd item *) -> x*

假设我有序列
{1;2;3;4}
,我想对第三个元素应用
(funx->x*2)
,产生
{1;2;6;4}
。构建这样一个函数的最佳方法是什么?

一个简单的方法是这样做,同时仍然将
seq
视为一个流:

let input = seq {1..4} 
let result = input |> Seq.mapi (fun i x -> match i with
                                           | 2 (* 3rd item *) -> x*2
                                           | _ -> x)

这样做的一个简单方法是,在适当地将
seq
视为流的同时:

let input = seq {1..4} 
let result = input |> Seq.mapi (fun i x -> match i with
                                           | 2 (* 3rd item *) -> x*2
                                           | _ -> x)

Seq.mapi,元素的位置作为额外输入;只需相应地改变你的双重乐趣。这将对序列中的每个元素应用映射,这似乎效率低下。没有更好的方法可以做到这一点吗?序列没有索引,因此您只能迭代到至少要更改的元素。为什么您认为这是低效的?是否必须是
seq
类型,或者如果您正在编写性能敏感代码,则必须是一个数组?seq.mapi,其中元素的位置作为额外输入;只需相应地改变你的双重乐趣。这将对序列中的每个元素应用映射,这似乎效率低下。没有更好的方法可以做到这一点吗?序列没有索引,因此您必须迭代至少要更改的元素。为什么您认为它效率低下?是否必须是
seq
类型,或者如果您正在编写性能敏感的代码,则必须是数组?