且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

等同于Python中的F#的Seq.scan()方法?

更新时间:2023-02-12 22:15:49

Ignacio's solution is almost right I think, but requires a operator of type ('a -> 'a -> 'a) and doesn't yield the first element.

def scan(f, state, it):
  for x in it:
    state = f(state, x)
    yield state
# test
>>> snoc = lambda xs,x: xs+[x]
>>> list(scan(snoc, [], 'abcd'))
[['a'], ['a', 'b'], ['a', 'b', 'c'], ['a', 'b', 'c', 'd']]
>>> list(scan(operator.add, 0, [1,2,3]))
[1,3,6]

Specifically, the type of Seq.scan is

('State -> 'T -> 'State) -> 'State -> seq<'T> -> seq<'State>

The default approach in Python is to write a scan with the type

('State -> 'State -> 'State) -> seq<'State> -> seq<'State>

This comes from the way that Python specifies reduce, which has the same type by default.

相关阅读

技术问答最新文章