LINUX.ORG.RU

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

 , ,


1

2

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

Вот это:

(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)) и получаем требуемую функцию.

★★★

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

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

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

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

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

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

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

Puzan ★★★ ()

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

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

IchBinFertig ()

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

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

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

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

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 ★★★ ()
Ответ на: комментарий от Puzan

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

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

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

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

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

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

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

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

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

www.linux.org.ru/forum/development/14273054?cid=14273402 — лисп/схему я тоже не знаю, а до кода на питоне, скажем, по читаемости это очень далеко отстоит

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

. Ага.

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 ★★★★★ ()