LINUX.ORG.RU

История изменений

Исправление Virtuos86, (текущая версия) :

Я напутал.

Редуктор (по-русски это правильнее, чем «редьюсер») — это функция, вычисление, которым оперирует свёртка. Свёртка является функциональным аналогом цикла с аккумулирующей переменной, которая накапливает промежуточные результаты, а на выходе даёт итоговый результат, так? Тогда редуктором будет тело цикла как особое вычисление, которое должно результат своей работы помещать в аккумулирующую переменную. Но в функциональном мире нет изменяемого состояния, поэтому появляется такое ограничение, что функция-редуктор должна принимать промежуточный результат и возвращать его (в измененном виде) — это будет аналогом аккумулирующей переменной. То есть типовой редуктор имеет вид:

def reducer(accum_res, i):
    res = ...
    update_accum_res(accum_res, res)
    return accum_res

Трансдьюсер, трансдуктор, transducer, TRANSform reDUSERs, по тому, что я изучил, выглядит изобретением велосипеда. По сути это обычный питоний декоратор, но особого рода. Проще всего показать на грубом схематичном примере:

def transducer(reducer):
    def inner(reducer1):
        def inner1(reducer2):
            ...
            def innerN(reducerN+1, i):
                res = reducerN+1(reducerN(...(reducer(init, i))))
                return res
            return innerN
            ...
        return inner1
    return inner
То есть на каждом этапе «разворачивания» трансдуктора он получает на вход новую функцию-редуктор. Изменяя выбираемые редукторы (и их порядок), можно изменять итоговую трансформацию результата. Я бы назвал это композицией редукторов, но вложенные функции не обязаны обязательно принимать на вход именно редукторы: это могут быть и какие-то предикаты. Не уверен, что для этого стоило придумывать новый термин).

В ФП декораторы, кстати, успешно заменяются каррированными функциями. И в каком-нибудь хаскелле такие вещи, вполне возможно, вообще тривиальны).

Исходная версия Virtuos86, :

Я напутал.

Редуктор — это функция, вычисление, которым оперирует свёртка. Свёртка является функциональным аналогом цикла с аккумулирующей переменной, которая накапливает промежуточные результаты, а на выходе даёт итоговый результат, так? Тогда редуктором (по-русски это правильнее, чем «редьюсер») будет тело цикла как особое вычисление, которое должно результат своей работы помещать в аккумулирующую переменную. Но в функциональном мире нет изменяемого состояния, поэтому появляется такое ограничение, что функция-редуктор должна принимать промежуточный результат и возвращать его (в измененном виде) — это будет аналогом аккумулирующей переменной. То есть типовой редуктор имеет вид:

def reducer(accum_res, i):
    res = ...
    update_accum_res(accum_res, res)
    return accum_res

Трансдьюсер, трансдуктор, transducer, TRANSform reDUSERs, по тому, что я изучил, выглядит изобретением велосипеда. По сути это обычный питоний декоратор, но особого рода. Проще всего показать на грубом схематичном примере:

def transducer(reducer):
    def inner(reducer1):
        def inner1(reducer2):
            ...
            def innerN(reducerN+1, i):
                res = reducerN+1(reducerN(...(reducer(init, i))))
                return res
            return innerN
            ...
        return inner1
    return inner
То есть на каждом этапе «разворачивания» трансдуктора он получает на вход новую функцию-редуктор. Изменяя выбираемые редукторы (и их порядок), можно изменять итоговую трансформацию результата. Я бы назвал это композицией редукторов, но вложенные функции не обязаны обязательно принимать на вход именно редукторы: это могут быть и какие-то предикаты. Не уверен, что для этого стоило придумывать новый термин).

В ФП декораторы, кстати, успешно заменяются каррированными функциями. И в каком-нибудь хаскелле такие вещи, вполне возможно, вообще тривиальны).