LINUX.ORG.RU

Вопрос терминологии

 , ,


2

3

Скажите, как правильно называется функция, которая возвращает функцию, которая применяет функцию к функциям от агрумента? %))

Вот это:

(define (f/apply ff . fn)
  (lambda args (apply ff (map (lambda (f) (apply f args)) fn))))

Надо написать комментарий, но я не знаю как это обозвать.

Используется, например, так: если нужна функция f(x) = sin(x) * cos(x), пишем (define f (f/apply * sin cos)) и получаем требуемую функцию.

★★★★★

Последнее исправление: Puzan (всего исправлений: 1)

Ответ на: комментарий от t184256

и сдавай

Я своё отсдавал 20 лет назад ;)

Puzan ★★★★★
() автор топика

как правильно называется

функция, которая возвращает функцию, которая применяет функцию к функциям от агрумента, очевидно же

Deleted
()

Скажите, как правильно называется функция, которая возвращает функцию,

Функция высшего порядка (HOF).

которая применяет функцию к функциям от агрумента?

Это уже не важно.

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

слишком просто

Поди знай, я не с первого раза распарсил )

Deleted
()
Ответ на: комментарий от theNamelessOne

Функция высшего порядка (HOF).

Это слишком обще. Может быть есть какой-то спецтальный термин, для обозначения таких HOF? Какой нибудь аппликатор, например.

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

Невозможно, чтоб для такой очевидной вещи не придумали термина.

Гугл на «функциональный аппликатор» выдаёт «Аппликаторы Ляпко» :))

Puzan ★★★★★
() автор топика

Скажите, как правильно называется функция, которая возвращает функцию, которая применяет функцию к функциям от агрумента? %))

Функция высшего порядка.

IchBinFertig
()

Для каждой такой фигни названий не придумаешь.

И если ты думаешь, что твой пример на Схеме что-то иллюстрирует, то тащемта он выглядит, как непонятное говно.

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

он выглядит, как непонятное говно.

А что тебе не понравилось в этом коде? Или ты просто не понял?

Puzan ★★★★★
() автор топика

возвращает функцию, которая применяет функцию к функциям от агрумента

Да это же promise, вид сбоку.

no-such-file ★★★★★
()

Немного выглядит мудренно, но чем-то напоминает функцию return для монады Cont.

dave ★★★★★
()

Или fmap для Cont. Так сходу не разберешь)

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

Это просто объединение нескольких функций посредством объединяющей функции. Например, если нужна функция f(x) = sin(x) * cos(x), пишем (define f (f/apply * sin cos)) и получаем требуемую функцию.

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

Я хотел об этом попросить ТС)

Я в хаскель не ездок :)

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

Твой пример с синусом и косинусом на haskell

import Control.Applicative

f = liftA2 (*) sin cos

main = print (f (pi/4))

Так что можешь гуглить по ключевому слову liftA2, liftA3 и т.д. В качестве контейнера тут a -> b

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

Тогда это семейство функций liftA, liftA2, liftA3... для стрелочного (функционального) типа

О, погуглил и пошел по ссылкам в википедии. Вот на что это похоже: Композиция функций (сложных функций).

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

Зачем вообще писать такой write-only код?

Почему write-only? Этот код предельно прост и понятен.

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

Да, как-то так. Я бы в комментарий ещё добавил наглядный примерчик, вроде того с синусом, косинусом и (*)

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

Не обращай внимания. Virtuos86 и RazrFalcon это два (вероятно, неплохих) растовика, которые регулярно набегают на ФП-треды с единственной целью: провокации и троллинг. Это их совершенно не красит, и чем быстрее на их троллинг перестанут реагировать, тем будет лучше для всех.

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

Да это мелочи, если и провокаторы, то тухловатые. Вот лет 10-15 назад тут были эпичнейшие лиспосрачи, не чета сегодняшним, только успевай обновлять страничку :)

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

О каком тролинге идёт речь? Автор спросил какое-бы описание придумать для той жути, что он соорудил. К языку у меня претензий нет.

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

для той жути, что он соорудил

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

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

Автор спросил какое-бы описание придумать для той жути, что он соорудил

В чём у тебя конкретно претензия: автор написал ненужную фигню, или нечитаемую фигню, или что?

  • Если нечитаемую, то это значит, что ты знаешь язык, и знаешь, как написать проще. Тогда welcome, рефакторь.
  • Если ненужную, то мы выше уже выяснили, что это просто обобщенная композиция (см. пример с синусом), она ненужной быть не может. ФП весь стоит на подобных функциях высшего порядка.
Crocodoom ★★★★★
()
Ответ на: комментарий от Crocodoom

С такими рустерами мы в HKT в языке никогда не дождёмся.

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

Да, liftA для a -> b это в точности композиция. liftA2 это композиция «с двумя входами» и т.д.

У него более общая функция. Там же ещё и количество аргументов произвольное.

f/apply * + - = \x y -> (x+y) * (x-y)
f/apply sum + - / = \x y -> sum (x+y) (x-y) (x/y)
f/apply sum f3 g3 h3 = \x y z -> sum (f3 x y z) (g3 x y z) (h3 x y z)
...

То есть это не просто liftAn

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

он выглядит, как непонятное говно.

А что тебе не понравилось в этом коде?

Вопрос терминологии (комментарий) — лисп/схему я тоже не знаю, а до кода на питоне, скажем, по читаемости это очень далеко отстоит

Или ты просто не понял?

. Ага.

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

до кода на питоне, скажем, по читаемости это очень далеко отстоит

С питоном я знаком постольку-поскольку, по этому не могут возразить. Но если ты приведешь аналогичный код на нём, то мы сможем сравнить.

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

Я как бы подписан на тег «функциональное проиграммирование», поэтому «набегаю» на законных основаниях. Степень регулярности зависит от частоты появления тредов и их интересности. Кстати, зачем ты подписан на тег «rust»? Чтобы набегать и троллить?

Ну и что совершенно точно не красит людей, так это переход на личности. Кастовать меня из-за комментария другого человека, до кучи — no way.

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

если вся эта фигня не асоциативна, то и композицией назвать нельзя.
а ещё, мне, не очень понятно что с возвращаемыми типами, по этому предлагаю второй вариант комментария: Парадокс Карри

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

если вся эта фигня не асоциативна

Ассоциативность зависит от релизации map, но согласно стандарту порядок применения функции в ней не определен. По этому, это косяк, надо написать ordered-map.

Puzan ★★★★★
() автор топика
Ответ на: комментарий от Puzan
from operator import add, sub, mul

def generate_applicator(*args):
    combinator, fs = args[0], args[1:]
    def applicator(*args):
        return combinator(*(f(*args) for f in fs))
    return applicator

generate_applicator = lambda *a: lambda *a1: a[0](*(f(*a1) for f in a[1:]))

if __name__ == '__main__':
    print(generate_applicator(mul, add, sub)(2, 1))

Две версии: человеческая и та, которая выглядит примерно как вариант на Схеме.

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

Мда...

Для меня (lambda args (apply ff (map (lambda (f) (apply f args)) fn))) читается намного легче чем return combinator(*(f(*args) for f in fs)). В последнем звёздочки и скобки вперемешку путают.

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