reducel, reducer

ふむ。Python でやってみるべ。
sequence だけを対象にするなら、簡単。さすがに10分もいらない。

def reducel(func, l):
    result = l[0]
    for item in l[1:]:
        result = func(result, item)
    return result

def reducer(func, l):
    result = l[-1]
    for item in reversed(l[:-1]):
        result = func(item, result)
    return result

if __name__ == '__main__':
    print reducel(lambda x, y: '(%s#%s)' % (x, y), range(1, 4 + 1))
    print reducer(lambda x, y: '(%s#%s)' % (x, y), range(1, 4 + 1))

さて、汎用的に iterable なデータすべてを対象にしようとするとどうなるか。reducel は簡単にできる。

def ireducel(func, l):
    it = iter(l)
    try:
        result = it.next()
    except StopIteration:
        raise TypeError('reducel requires non-empty elements')
    for item in it:
        result = func(result, item)
    return result

reducer も非 sequence で iterable なデータを相手にできるけど、 reducel と違って最後から評価する必要があるので、対象データを結局全部メモリに載せる必要がある。なので、結局は

def ireducer(func, l):
    return reducer(func, tuple(l))

とするしかないような気がする。