F# 有 foldList 函数吗?
Does F# have a foldList function?
Mathematica
或许其他语言也有 foldList
功能。它与 fold
非常相似,但不是仅返回最终计算值,而是 returns 每个中间值。
在 F# 中编写 foldList
函数并不难:
let foldList f (x: 'S) (m: list<'T>) =
let fs (xs: list<'S>) (y: 'T) = (f (Seq.head xs) y)::xs
List.fold fs [x] m
|> List.rev
let m = [1; 2; -3; 5]
foldList (+) 0 m
// val it : int list = [0; 1; 3; 0; 5]
List.fold (+) 0 m
// val it : int = 5
F#有这样的功能吗?
如果没有,是否有比上述更有效的实施方式?
有没有办法避免调用 List.rev?
是的,这是一个内置函数,叫做List.scan
:
let m = [1; 2; -3; 5]
List.scan (+) 0 m;;
//val it : int list = [0; 1; 3; 0; 5]
为了回答您关于反转列表的问题,FSharp.Core 中的实现避免了使用突变来反转列表。这个可变 API 没有公开。有兴趣的可以找源码here
Mathematica
或许其他语言也有 foldList
功能。它与 fold
非常相似,但不是仅返回最终计算值,而是 returns 每个中间值。
在 F# 中编写 foldList
函数并不难:
let foldList f (x: 'S) (m: list<'T>) =
let fs (xs: list<'S>) (y: 'T) = (f (Seq.head xs) y)::xs
List.fold fs [x] m
|> List.rev
let m = [1; 2; -3; 5]
foldList (+) 0 m
// val it : int list = [0; 1; 3; 0; 5]
List.fold (+) 0 m
// val it : int = 5
F#有这样的功能吗? 如果没有,是否有比上述更有效的实施方式? 有没有办法避免调用 List.rev?
是的,这是一个内置函数,叫做List.scan
:
let m = [1; 2; -3; 5]
List.scan (+) 0 m;;
//val it : int list = [0; 1; 3; 0; 5]
为了回答您关于反转列表的问题,FSharp.Core 中的实现避免了使用突变来反转列表。这个可变 API 没有公开。有兴趣的可以找源码here