LINUX.ORG.RU

Бросай это дело. Сейчас вэб-технологии в моде, а не эти ваши хер-пойми-что

anonymous
()
Ответ на: комментарий от Zhbert

Он не правильно понимает это как композицию функций. Композиция и раньше была, зачем придумывать новое понятие?

Bobby_
() автор топика
Ответ на: комментарий от Bobby_

Композиция и раньше была, зачем придумывать новое понятие?

Ну так композиция функций - это функция. Зачем придумывать новое понятие?

tailgunner ★★★★★
()

Трансдьюсер - это тоже самое, что и композиция, но без создания промежуточных результатов.

Биореактор хорошую тебе ссылку кинул.

slaykovsky ★★★
()
Последнее исправление: slaykovsky (всего исправлений: 1)
Ответ на: комментарий от slaykovsky

Функтор - это отображение между категориями ([int] -> [string])

Написано довольно неряшливо. Функтор в данном случае это a -> [a]

Crocodoom ★★★★★
()
Ответ на: комментарий от slaykovsky

Биореактор хорошую тебе ссылку кинул

«Пока писал это, понял, что я недостаточно компетентен в этой области. Все, что могу сделать — дать ссылку на статью про трансдьюсеры от Рича Хикки — их создателя»

Зашибись. Нахрена писать такие тупые статьи?

Bobby_
() автор топика
Ответ на: комментарий от slaykovsky

С утра не то написал, шо хотел. Ты сигнатуру return написал. А функтор как раз A -> B ну или как я пример привёл [int] -> [string].

slaykovsky ★★★
()
Ответ на: комментарий от Bobby_

Композиция - функция от двух или более функций. Трансдьюсер - внезапно, тоже.

Нет.

Что именно «нет» - трансдьюсер не является композицией функций? Скажи об этом Ричи:

http://blog.cognitect.com/blog/2014/8/6/transducers-are-coming

transducers compose using ordinary function composition.

tailgunner ★★★★★
()
Ответ на: комментарий от slaykovsky

Функтор - это отображение между категориями

Можешь написать, между какими именно категориями?

И чо за «данный случай» тоже не понятно.

В случае списка

Crocodoom ★★★★★
()
Ответ на: комментарий от Crocodoom

Можешь написать, между какими именно категориями?

Между любыми.

В случае списка

Ты написал return. return - это не отображение, это преобразование Id функтора в M функтор (X -> M X).

slaykovsky ★★★
()
Ответ на: комментарий от slaykovsky

Можешь написать, между какими именно категориями?

Между любыми.

Пример любых можно?:) Для списка хотя бы

Crocodoom ★★★★★
()
Ответ на: комментарий от Crocodoom

A - любая категория, B - любая категория.

В хаскелле у тебя только одна категория типов Hask. Какие ты хочешь категории для монады от меня узнать, я не понимаю честно. Расписать мне все стрелки для списка, шоли? :)

Ну т.е. ты бы написал, что ты хочешь сказать, мож я чо путаю %)

slaykovsky ★★★
()
Последнее исправление: slaykovsky (всего исправлений: 1)
Ответ на: комментарий от slaykovsky

Ок, принято =) Я просто хотел убедиться, что ты понимаешь, о чём говоришь. Потому что из твоей первой фразы, к которой я прицепился

Функтор - это отображение между категориями ([int] -> [string])

Легко сделать ошибочный вывод, что «категории» в данном случае это [int] и [string].

Хотя таких категорий нет, и функтор-список отображает типы a в [a] и стрелки a -> b в [a] -> [b]. Категория тут везде одна, фиксированная, которая содержит в качестве объектов все типы (Hask).

Crocodoom ★★★★★
()
Ответ на: комментарий от slaykovsky

Да, ты прав, надо было понятней мне написать. :)

Не стоит беспокоиться. За упоротыми дискуссиями о функторах никто особо не следит.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Bobby_

Я напутал.

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

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 ★★★★★
()
Последнее исправление: Virtuos86 (всего исправлений: 1)
Ответ на: комментарий от Virtuos86

Проще всего показать на грубом схематичном примере:

Напортачил, но лень исправлять.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

Не стоит беспокоиться. За упоротыми дискуссиями о функторах никто особо не следит.

Отнюдь. Я например следил за мыслью.

AndreyKl ★★★★★
()
Ответ на: комментарий от Virtuos86

Твои слова, емнип, ничего особо не опровергает впринципе, так что ничего нового ты не сказал сейчас.

AndreyKl ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.