Автор Тема: Higher-order function  (Прочитано 18447 раз)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Higher-order function
« Ответ #15 : Ноябрь 13, 2012, 05:06:06 pm »
Я все равно недопонимаю видимо. Почему конструировать?
Функция/замыкание просто хранит значения захваченных переменных. Функция то та же самая. В чистом ФП это наверно не совсем так, но мы и не о ФП говорим, а вообще.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Higher-order function
« Ответ #16 : Ноябрь 13, 2012, 05:16:32 pm »
Вот упрощенный аналог твоего кода на Lua:
function foo()
    local n = 0
    function closure()
        n = n + 1
        return n
    end
    return closure
end

f = foo()

print(f())
print(f())
print(f())

--Log:
--[[
1
2
3
--]]

closure какой была, такой и осталась...

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Higher-order function
« Ответ #17 : Ноябрь 13, 2012, 05:24:22 pm »
Хотя нет. У тебя другая логика. Ну не суть.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Higher-order function
« Ответ #18 : Ноябрь 13, 2012, 05:26:02 pm »
Вот так у тебя:
function foo()
    local n = math.random()
    function closure()
        return n
    end
    return closure
end

f = foo()
f1 = foo()

print(f())
print(f1())
print(f())
print(f1())

--Log:
--[[
0.0012512588885159
0.56358531449324
0.0012512588885159
0.56358531449324
--]]

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Higher-order function
« Ответ #19 : Ноябрь 13, 2012, 06:07:54 pm »
Вот упрощенный аналог твоего кода на Lua:
...
closure какой была, такой и осталась...
Во-первых не надо путать как именно HOF реализуется/применяется с самой концепцией HOF.
Во-вторых я же явным образом писал, что с HOF в Луа все хорошо (точнее там настолько же хорошо как и в С++ и в js, но конечно хуже чем в haskell). А вот в Обероне и Си - плохо.
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Higher-order function
« Ответ #20 : Ноябрь 14, 2012, 08:33:39 am »
http://en.wikipedia.org/wiki/Functional_programming#First-class_and_higher-order_functions

Цитировать
Programming languages that support function pointers as function parameters can emulate higher-order functions. Such languages include the C and C++ family. An example is the following C code which computes an approximation of the integral of an arbitrary function:

Цитировать
can emulate

Эмуляция ФВП ещё не есть полноценная ФВП.
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Higher-order function
« Ответ #21 : Ноябрь 14, 2012, 09:20:03 am »
Глупо спорить о определениях. Предположим, что HOF есть в паскале (согласно какому-то там определению, без изменения собственно языка) - что от этого изменилось? Внезапно на паскале стало удобно писать и использовать стандартные библиотеки аля haskell?

Один из методов выхода из терминологического тупика - табуирование терминов. Табуируем термин HOF. Заменяем его на его смысл/свойства, и смотрим что получится.

Итак, эта штука, которую отныне нельзя называть, привносит в язык следующее:
Цитировать
enable partial application or currying, a technique in which a function is applied to its arguments one at a time, with each application returning a new function that accepts the next argument. This allows one to succinctly express, for example, the successor function as the addition operator partially applied to the natural number one.
Вопрос - в обероне-паскале это есть? Потому как если бы в них была бы эта штука, которую нельзя называть, в них было бы и частичное применение и карринг.

Ну и еще раз повторюсь - когда говорят есть вот эта штука в языке, или нет - подразумевают возможность безболезненно писать код на этом языке во вполне конкретном стиле. До С++11 в плюсах было весьма болезненно писать в функциональном стиле, а поскольку весть stl по сути своей является функциональщиной чистой воды, и является одновременно главной и стандартной либой плюсов, пользоваться плюсами было весьма болезненно. Сейчас же стало писать НАМНОГО приятней и проще. И код понятней. Именно потому, что теперь в плюсах теперь есть то, чего нельзя называть.
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Higher-order function
« Ответ #22 : Ноябрь 15, 2012, 07:03:38 am »
Functions in Lua are first-class values with proper lexical scoping.

What does it mean for functions to be "first-class values"? It means that, in Lua, a function is a value with the same rights as conventional values like numbers and strings. Functions can be stored in variables (both global and local) and in tables, can be passed as arguments, and can be returned by other functions.

What does it mean for functions to have "lexical scoping"? It means that functions can access variables of its enclosing functions. (It also means that Lua contains the lambda calculus properly.) As we will see in this chapter, this apparently innocuous property brings great power to the language, because it allows us to apply in Lua many powerful programming techniques from the functional-language world. Even if you have no interest at all in functional programming, it is worth learning a little about how to explore those techniques, because they can make your programs smaller and simpler.

В общем пока остаюсь при своем мнении. Везде повторяется одно и то же определение. И замыкания с фвп не смешиваются.
Все источники говорят о трех действиях:
1. Присвоить переменной
2. Принять аргументом
3. Вернуть

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Higher-order function
« Ответ #23 : Ноябрь 15, 2012, 07:20:54 am »
http://fprog.ru/2009/issue3/eugene-kirpichov-elements-of-functional-languages/

Цитировать
Функция называется функцией высшего порядка, если один из её аргументов — это функция, либо её возвращаемое значение — это функция.

И далее:
Цитировать
Замыкания жизненно важны для использования функций высшего порядка; без замыканий становится невозможно использовать сколько-нибудь полезную ФВП (как мы видели выше на примере map, написать полезную ФВП возможно, однако нетривиальные варианты ее использования оказываются недостижимыми).

Т.е. без замыканий мало пользы от ФВП, но первые не в коем разе не определяют последние.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Higher-order function
« Ответ #24 : Ноябрь 15, 2012, 07:33:39 am »
Functions in Lua are first-class values with proper lexical scoping.

What does it mean for functions to be "first-class values"? It means that, in Lua, a function is a value with the same rights as conventional values like numbers and strings. Functions can be stored in variables (both global and local) and in tables, can be passed as arguments, and can be returned by other functions.

What does it mean for functions to have "lexical scoping"? It means that functions can access variables of its enclosing functions. (It also means that Lua contains the lambda calculus properly.) As we will see in this chapter, this apparently innocuous property brings great power to the language, because it allows us to apply in Lua many powerful programming techniques from the functional-language world. Even if you have no interest at all in functional programming, it is worth learning a little about how to explore those techniques, because they can make your programs smaller and simpler.

В общем пока остаюсь при своем мнении. Везде повторяется одно и то же определение. И замыкания с фвп не смешиваются.
Все источники говорят о трех действиях:
1. Присвоить переменной
2. Принять аргументом
3. Вернуть

Это определение - определение first-class functions а не HOF. Многие путают одно с другим, и Евгений Кирпичев не исключение (хотя ему как раз должно быть стыдно это путать).
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Higher-order function
« Ответ #25 : Ноябрь 15, 2012, 07:37:02 am »
Посмотри внимательно:
Цитировать
first-class values

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Higher-order function
« Ответ #26 : Ноябрь 15, 2012, 07:40:52 am »
Посмотри внимательно:
Цитировать
first-class values

Это не отменяет того факта, что там описывается именно first-class functions.
Цитировать
In computer science, a programming language is said to have first-class functions if it treats functions as first-class citizens. Specifically, this means the language supports passing functions as arguments to other functions, returning them as the values from other functions, and assigning them to variables or storing them in data structures.

Да, а если посмотришь еще внимательней, то увидишь что там нет ни слова про HOF :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Higher-order function
« Ответ #27 : Ноябрь 15, 2012, 07:43:58 am »
Вот что я хотел этим сказать:

Цитировать
Определяющей характеристикой функциональных языков программирования является повышение функций до состояния первого класса. С функцией можно совершать те же действия, что и со значениями других встроенных типов, с сопоставимым объемом усилий.

Ниже представлены типичные вопросы для оценки состояния первого класса.

Можно ли привязать идентификатор к значению? Если да, можно ли присвоить ему имя?

Можно ли хранить значение в структуре данных, такой как список?

Можно ли передать значение в качестве аргумента в вызов функции?

Можно ли вернуть значение в качестве значения вызова функции?

Последние два вопроса оценки определяют то, что известно как операции высшего порядка или функции высшего порядка. Функции высшего порядка принимают функции в качестве аргументов и возвращают функции в качестве значения вызова функции. Эти операции поддерживают такие основы функционального программирования как функции сопоставления и объединение функций.
http://msdn.microsoft.com/ru-ru/library/dd233158.aspx

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Higher-order function
« Ответ #28 : Ноябрь 15, 2012, 08:05:27 am »
Вот что я хотел этим сказать:

Цитировать
Определяющей характеристикой функциональных языков программирования является повышение функций до состояния первого класса. С функцией можно совершать те же действия, что и со значениями других встроенных типов, с сопоставимым объемом усилий.

Ниже представлены типичные вопросы для оценки состояния первого класса.

Можно ли привязать идентификатор к значению? Если да, можно ли присвоить ему имя?

Можно ли хранить значение в структуре данных, такой как список?

Можно ли передать значение в качестве аргумента в вызов функции?

Можно ли вернуть значение в качестве значения вызова функции?

Последние два вопроса оценки определяют то, что известно как операции высшего порядка или функции высшего порядка. Функции высшего порядка принимают функции в качестве аргументов и возвращают функции в качестве значения вызова функции. Эти операции поддерживают такие основы функционального программирования как функции сопоставления и объединение функций.
http://msdn.microsoft.com/ru-ru/library/dd233158.aspx
До-о! Мелкософт конечно знатоки функциональщины! Особенно их пейсатели msdn'a :-)

Для начала, кто-нибудь видел язык, где можно было бы засунуть функцию в структуру данных, но нельзя было бы передать функцию как параметр в другую функцию? Ну и возвратить её как значение.

Далее, данное определение чуть более чем полностью бесполезно, ибо не дает какого-либо профита, смешивая два понятия в одно. Если первое (first class functions) неотвратимо приводит ко второму (hof), зачем вообще иметь два понятия вместо одного?
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Higher-order function
« Ответ #29 : Ноябрь 15, 2012, 08:13:03 am »
Все очень просто, valexey:
Цитировать
The distinction between the two is subtle: "higher-order" describes a mathematical concept of functions that operate on other functions, while "first-class" is a computer science term that describes programming language entities that have no restriction on their use (thus first-class functions can appear anywhere in the program that other first-class entities like numbers can, including as arguments to other functions and as their return values).
http://en.wikipedia.org/wiki/Functional_programming#First-class_and_higher-order_functions
 ;)