Oberon space

General Category => Общий раздел => Тема начата: ilovb от Ноябрь 13, 2012, 03:55:20 pm

Название: Higher-order function
Отправлено: ilovb от Ноябрь 13, 2012, 03:55:20 pm
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:

// Compute the integral of f() within the interval [a,b]
double integral(double (*f)(double x), double a, double b)
{
    double  sum, dt;
    int     i;
 
    // Numerical integration: 0th order approximation
    sum = 0.0;
    dt = (b - a) / 100.0;
    for (i = 0;  i < 100;  i++)
        sum += (*f)(i * dt + a) * dt;
 
    return sum;
}

Получается в Oberon'ах есть эти самые функции высшего порядка. И даже лучше чем в Си, т.к. имеют тип.

зы На сколько однако качественнее ангельская википедия (касаемо IT)
Название: Re: Higher-order function
Отправлено: valexey_u от Ноябрь 13, 2012, 04:00:19 pm
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:

// Compute the integral of f() within the interval [a,b]
double integral(double (*f)(double x), double a, double b)
{
...
}

Получается в Oberon'ах есть эти самые функции высшего порядка. И даже лучше чем в Си, т.к. имеют тип.

зы На сколько однако качественнее ангельская википедия (касаемо IT)
А в сях (и особенно C++) они что, тип не имеют? ;-) Как ты думаешь, что вот это такое из приведенного тобой кода: "double (*f)(double x)" ? ;-)
Название: Re: Higher-order function
Отправлено: valexey_u от Ноябрь 13, 2012, 04:02:52 pm
Ну и надергаю сюда своих ответов по HOF (и почему то, что есть в Обероне и Си HOF'ом назвать нельзя):

http://oberspace.dyndns.org/index.php/topic,366.msg10118.html#msg10118
Цитировать
Цитировать
ps Я вот если чесна вообще не очень понимаю чем отличается фвп от процедурного типа в паскале...
А отличие очень простое - функция высшего порядка это функция которая принимает на вход одну или несколько функций и на выход гонит тоже функцию. Так вот, чтобы это имело смысл, очень желательно иметь для функций не только одну лишь операцию присваивания. Должна быть возможность вернуть новую функцию, которой еще не было в программе. Для этого можно использовать каррирование, замыкания, комбинаторы и так далее.

http://oberspace.dyndns.org/index.php/topic,366.msg10123.html#msg10123
Цитировать
ok, давай на примерах. Представим себе, что в неком языке "Оo" есть целые числа. Есть как целочисленные литералы, так и целочисленные переменные. Целочисленной переменной можно присваивать целочисленные литералы, также можно присваивать значение одной переменной другой переменной. Все, больше ни одной операции для целых чисел в языке Oo нет (операций сложения, вычитания, умножения и так далее).

Внимание вопрос - можно ли считать, что данный язык полноценно поддерживает концепцию целых чисел?
Название: Re: Higher-order function
Отправлено: ilovb от Ноябрь 13, 2012, 04:05:07 pm
Да я ж не шарю в сях. Ни строчки не писал  ;D
Ну пусть так.
Вопрос в другом: Это оно? Т.е. тупо указатель на функцию под глянцевым названием?
Название: Re: Higher-order function
Отправлено: valexey_u от Ноябрь 13, 2012, 04:07:03 pm
Да я ж не шарю в сях. Ни строчки не писал  ;D
Ну пусть так.
Вопрос в другом: Это оно? Т.е. тупо указатель на функцию под глянцевым названием?
Таки нет. Я выше процитировал свои сообщения. Там вроде бы объясняется. Даже на примерах.

Просто указатель на функцию (даже типобезопасный) - это на уровне поддержки целых чисел без возможности их складывать, сравнивать, умножать и так далее.
Название: Re: Higher-order function
Отправлено: ilovb от Ноябрь 13, 2012, 04:09:16 pm
Ну и надергаю сюда своих ответов по HOF (и почему то, что есть в Обероне и Си HOF'ом назвать нельзя):

OK. В WIKI пиндосским по белому начертано:
Цитировать
In mathematics and computer science, a higher-order function (also functional form, functional or functor) is a function that does at least one of the following:
* take one or more functions as an input
* output a function

Других определений я не встречал.  :)
Название: Re: Higher-order function
Отправлено: valexey_u от Ноябрь 13, 2012, 04:10:44 pm
Ну и надергаю сюда своих ответов по HOF (и почему то, что есть в Обероне и Си HOF'ом назвать нельзя):

OK. В WIKI пиндосским по белому начертано:
Цитировать
In mathematics and computer science, a higher-order function (also functional form, functional or functor) is a function that does at least one of the following:
* take one or more functions as an input
* output a function

Других определений я не встречал.  :)
Ну да. Но мы же о реальном использовании говорим а не о формальных признаках? Кому нужны такие HOF, которые не могут вернуть ничего интересного?
Название: Re: Higher-order function
Отправлено: ilovb от Ноябрь 13, 2012, 04:19:24 pm
А чего такого интересного они могут вернуть, чего нельзя на том же Си?
Название: Re: Higher-order function
Отправлено: valexey_u от Ноябрь 13, 2012, 04:20:03 pm
А чего такого интересного они могут вернуть, чего нельзя сделать на том же Си?
Например вернуть новую функцию :-) Которой до того не было.
Название: Re: Higher-order function
Отправлено: ilovb от Ноябрь 13, 2012, 04:21:52 pm
Что значит не было? Можно пример?
Название: Re: Higher-order function
Отправлено: valexey_u от Ноябрь 13, 2012, 04:41:20 pm
Что значит не было? Можно пример?
А ты уверен что хочешь это видеть? :-)

Вот простейший пример (замечу, что C++ не лучший язык для демонстрации):
#include <algorithm>
#include <iostream>

using namespace std;

function<int()> get_f() {
    auto t = random();
    return [=](){return t;};
}

int main() {
    auto f1 = get_f();
    auto f2 = get_f();
    cout << f1() <<"\t" << f2() << endl;
    return 0;
}

Функция get_f возвращает функцию которая будет возвращать одно и то же случайное число (кокое именно - определяется при генерации оной функции).
Название: Re: Higher-order function
Отправлено: ilovb от Ноябрь 13, 2012, 04:46:55 pm
Тык это ж замыкание вроде?!  ???
Название: Re: Higher-order function
Отправлено: valexey_u от Ноябрь 13, 2012, 04:49:27 pm
Тык это ж замыкание вроде?!  ???
Замыкание - это не фунция высшего порядка :-) Это захват переменных из области видимости (захват в том смысле что можно с собою унести, в Обероне нет замыканий, хотя локальные функции могут использовать локальные переменные).

Да, в данном случае новая функция генерируется именно через механизм замыканий.

Короче, для полноценного HOF не достаточно просто указателя на функцию, нужна более сложная структура.
Название: Re: Higher-order function
Отправлено: ilovb от Ноябрь 13, 2012, 04:56:19 pm
Тык это ж замыкание вроде?!  ???
Замыкание - это не фунция высшего порядка :-)
Ну и я ровно о том же.

Или ты хочешь сказать что HOF без замыканий не HOF?! (и хде такое утверждается у аццов ФП?)
По мне так наоборот замыкания без HOF не могут быть.  :)
Название: Re: Higher-order function
Отправлено: valexey_u от Ноябрь 13, 2012, 05:00:41 pm
Тык это ж замыкание вроде?!  ???
Замыкание - это не фунция высшего порядка :-)
Ну и я ровно о том же.

Или ты хочешь сказать что HOF без замыканий не HOF?! (и хде такое утверждается у аццов ФП?)
Я о том, что для полноценного HOF, нужно таки иметь возможность не только туда-сюда присваивать и вызывать, но еще и что-то не столь тривиальное делать. Например конструировать новые функции. Иначе это недоHOF в плане применимости ограничится sort'ом.

Это просто из личной практики применения всего этого.
Название: Re: Higher-order function
Отправлено: ilovb от Ноябрь 13, 2012, 05:06:06 pm
Я все равно недопонимаю видимо. Почему конструировать?
Функция/замыкание просто хранит значения захваченных переменных. Функция то та же самая. В чистом ФП это наверно не совсем так, но мы и не о ФП говорим, а вообще.
Название: Re: Higher-order function
Отправлено: ilovb от Ноябрь 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 какой была, такой и осталась...
Название: Re: Higher-order function
Отправлено: ilovb от Ноябрь 13, 2012, 05:24:22 pm
Хотя нет. У тебя другая логика. Ну не суть.
Название: Re: Higher-order function
Отправлено: ilovb от Ноябрь 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
--]]
Название: Re: Higher-order function
Отправлено: valexey_u от Ноябрь 13, 2012, 06:07:54 pm
Вот упрощенный аналог твоего кода на Lua:
...
closure какой была, такой и осталась...
Во-первых не надо путать как именно HOF реализуется/применяется с самой концепцией HOF.
Во-вторых я же явным образом писал, что с HOF в Луа все хорошо (точнее там настолько же хорошо как и в С++ и в js, но конечно хуже чем в haskell). А вот в Обероне и Си - плохо.
Название: Re: Higher-order function
Отправлено: Geniepro от Ноябрь 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

Эмуляция ФВП ещё не есть полноценная ФВП.
Название: Re: Higher-order function
Отправлено: valexey_u от Ноябрь 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 по сути своей является функциональщиной чистой воды, и является одновременно главной и стандартной либой плюсов, пользоваться плюсами было весьма болезненно. Сейчас же стало писать НАМНОГО приятней и проще. И код понятней. Именно потому, что теперь в плюсах теперь есть то, чего нельзя называть.
Название: Re: Higher-order function
Отправлено: ilovb от Ноябрь 15, 2012, 07:03:38 am
Цитата: http://www.lua.org/pil/6.html
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. Вернуть
Название: Re: Higher-order function
Отправлено: ilovb от Ноябрь 15, 2012, 07:20:54 am
http://fprog.ru/2009/issue3/eugene-kirpichov-elements-of-functional-languages/

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

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

Т.е. без замыканий мало пользы от ФВП, но первые не в коем разе не определяют последние.
Название: Re: Higher-order function
Отправлено: valexey_u от Ноябрь 15, 2012, 07:33:39 am
Цитата: http://www.lua.org/pil/6.html
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. Многие путают одно с другим, и Евгений Кирпичев не исключение (хотя ему как раз должно быть стыдно это путать).
Название: Re: Higher-order function
Отправлено: ilovb от Ноябрь 15, 2012, 07:37:02 am
Посмотри внимательно:
Цитировать
first-class values
Название: Re: Higher-order function
Отправлено: valexey_u от Ноябрь 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 :-)
Название: Re: Higher-order function
Отправлено: ilovb от Ноябрь 15, 2012, 07:43:58 am
Вот что я хотел этим сказать:

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

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

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

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

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

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

Последние два вопроса оценки определяют то, что известно как операции высшего порядка или функции высшего порядка. Функции высшего порядка принимают функции в качестве аргументов и возвращают функции в качестве значения вызова функции. Эти операции поддерживают такие основы функционального программирования как функции сопоставления и объединение функций.
http://msdn.microsoft.com/ru-ru/library/dd233158.aspx
Название: Re: Higher-order function
Отправлено: valexey_u от Ноябрь 15, 2012, 08:05:27 am
Вот что я хотел этим сказать:

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

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

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

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

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

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

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

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

Далее, данное определение чуть более чем полностью бесполезно, ибо не дает какого-либо профита, смешивая два понятия в одно. Если первое (first class functions) неотвратимо приводит ко второму (hof), зачем вообще иметь два понятия вместо одного?
Название: Re: Higher-order function
Отправлено: ilovb от Ноябрь 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
 ;)
Название: Re: Higher-order function
Отправлено: ilovb от Ноябрь 15, 2012, 08:15:31 am
Даже поясню:
Функция первого класса - это компьютерный термин, и определяет три действия:
1. Присвоить переменной
2. Принять аргументом
3. Вернуть

Если убрать первое действие, то получится математическое понятие "Функция высшего порядка"  ;)
Название: Re: Higher-order function
Отправлено: valexey_u от Ноябрь 15, 2012, 08:19:41 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
 ;)

Мы сейчас пойдем уже по второму кругу :-)
Еще раз процитирую оттуда же:
Цитировать
Higher-order functions 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.

А между прочим, пока мы ходим кругами, никто не задался вопросом - что такое функция, и чем от нее отличается указатель на оную функцию :-)
Название: Re: Higher-order function
Отправлено: Valery Solovey от Ноябрь 15, 2012, 08:36:20 am
Если в языке возможен карринг, то возможен исключительно благодаря этим самым hof, но отсутствие карринга не является признаком отсутствия hof.

А про функцию и указатель: передача функции по ссылке так же законна, как и по значению.

hof - это элемент функционального языка, а не язык целиком, и не надо переносить с ФЯ на hof всё его содержание.
Название: Re: Higher-order function
Отправлено: Geniepro от Ноябрь 15, 2012, 08:40:03 am
До-о! Мелкософт конечно знатоки функциональщины!
Вообще-то да. Ведь основные работы по тому же хаскелю ведутся в Microsoft Research, да и F# тоже достаточно развит в плане ФП...
Название: Re: Higher-order function
Отправлено: ilovb от Ноябрь 15, 2012, 08:46:44 am
Цитата: valexey
Higher-order functions 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.

Что в данном месте переводится "разрешают". Не вижу ничего противоречащего моим словам.
Вот если бы там было написано: "ФВП определяются наличием currying'а"...

ps И что такое функция в программировании?  :)
Название: Re: Higher-order function
Отправлено: valexey_u от Ноябрь 15, 2012, 08:50:15 am
Если в языке возможен карринг, то возможен исключительно благодаря этим самым hof, но отсутствие карринга не является признаком отсутствия hof.

А про функцию и указатель: передача функции по ссылке так же законна, как и по значению.

hof - это элемент функционального языка, а не язык целиком, и не надо переносить с ФЯ на hof всё его содержание.
Везде имелось ввиду именно передача по значению (first class values).
Название: Re: Higher-order function
Отправлено: DIzer от Ноябрь 15, 2012, 09:31:57 am
Отображение на  яп некоторого вспомогательного алгоритма,  иловб, более корректный ьермин - подпрограмма
Название: Re: Higher-order function
Отправлено: ilovb от Ноябрь 15, 2012, 09:49:07 am
DIzer, не понял к чему вы это. Поясните плиз.
Название: Re: Higher-order function
Отправлено: DIzer от Ноябрь 15, 2012, 09:56:50 am
Вы спросили- что такое функция в прогоаммировании - я ответил
Название: Re: Higher-order function
Отправлено: ilovb от Ноябрь 15, 2012, 10:11:04 am
А я тут гадаю...  ;D
Ну вопрос вообще к valexey был.

Цитата: valexey
А между прочим, пока мы ходим кругами, никто не задался вопросом - что такое функция, и чем от нее отличается указатель на оную функцию :-)
Название: Re: Higher-order function
Отправлено: valexey_u от Ноябрь 15, 2012, 10:17:51 am
Вы спросили- что такое функция в прогоаммировании - я ответил
Это никак не отвечает на поставленный мною вопрос :-)
Название: Re: Higher-order function
Отправлено: DIzer от Ноябрь 15, 2012, 10:41:31 am
Я отвечал не на ваш  вопрос,  Алексей. а на Иловб
Название: Re: Higher-order function
Отправлено: ilovb от Ноябрь 15, 2012, 10:42:59 am
 ;D ;D ;D
Последние 6 постов доставляют.
Название: Re: Higher-order function
Отправлено: valexey_u от Ноябрь 15, 2012, 10:44:38 am
;D ;D ;D
Последние 6 постов доставляют.
Кстати, да. Напоминают игру "сломанный телефон".
Название: Re: Higher-order function
Отправлено: DIzer от Ноябрь 15, 2012, 10:49:24 am
да нет - просто тяжко отвечать развернуто через телефон в движущемя междугороднем автобусе
Название: Re: Higher-order function
Отправлено: Valery от Ноябрь 16, 2012, 06:35:03 am
Вставлю свои две копейки.
1. Указатель на функцию и функция - сильно разные вещи в императивных языках обычно. Указателя на функцию в языке может и не быть, а функции - по-любому присутствуют.
В Паскале указателей на функцию нет, а есть процедурный тип. Его реализация под капотом, скорее всего - тоже указатель, но ведь в самом языке его нет!
Путаница ИМХО пошла с Си, поскольку там было правило: имя функции = константа-указатель на функцию (того же типа).
2. ИМХО функции высших порядков лучше всего смотреть в Лиспе. Там список и функция - близнецы-братья.
Возвращаемый список может быть функцией (списком) сформированным во время работы программы. И тут же во время работы программы эту функцию можно выполнить.
В императивном языке вроде Си нельзя во время программы сформировать функцию на Си и тут же ее выполнить. Как минимум потребуется вызов компилятора.
Вот БлэкБокс (не Компонентный паскаль!) такое вроде позволяет... :)
Название: Re: Higher-order function
Отправлено: valexey_u от Ноябрь 16, 2012, 07:11:02 am
Вставлю свои две копейки.
1. Указатель на функцию и функция - сильно разные вещи в императивных языках обычно. Указателя на функцию в языке может и не быть, а функции - по-любому присутствуют.
В Паскале указателей на функцию нет, а есть процедурный тип. Его реализация под капотом, скорее всего - тоже указатель, но ведь в самом языке его нет!
Стоп. А чем оно от оного указателя (или ссылки) отличается? Кроме названия в документации. Термины не интересны, интересна суть.

2. ИМХО функции высших порядков лучше всего смотреть в Лиспе. Там список и функция - близнецы-братья.
Возвращаемый список может быть функцией (списком) сформированным во время работы программы. И тут же во время работы программы эту функцию можно выполнить.
В императивном языке вроде Си нельзя во время программы сформировать функцию на Си и тут же ее выполнить. Как минимум потребуется вызов компилятора.
В случае именно что Си - не потребуется. То есть это сделать таки можно. Но, как водится, не портабельно.

Вот БлэкБокс (не Компонентный паскаль!) такое вроде позволяет... :)
Без вызова компилятора? Не верю :-)
Название: Re: Higher-order function
Отправлено: ilovb от Ноябрь 16, 2012, 08:28:15 am
А на Си как? Типа сделать массив под размер кода функции, напихать туда динамически маш кодов, получить указатель на начало массива и вернуть это как функцию?  ;)

Я такое еще в школе на васике сооружал  ;D
Название: Re: Higher-order function
Отправлено: valexey_u от Ноябрь 16, 2012, 08:29:48 am
А на Си как? Типа сделать массив под размер кода функции, напихать туда динамически маш кодов, получить указатель на начало массива и вернуть это как функцию?  ;)

Я такое еще в школе на васике сооружал  ;D
Угу. Это дело широко применяется для "jit-компиляции" всяких выражений прямо внутри программы. Например так можно собрать regexp который будет в результате нифига не интерпретироваться.
Название: Re: Higher-order function
Отправлено: ilovb от Ноябрь 16, 2012, 08:31:36 am
В ЧЯ в принципе тоже можно, если импортировать SYSTEM
Название: Re: Higher-order function
Отправлено: valexey_u от Ноябрь 16, 2012, 08:52:55 am
В ЧЯ в принципе тоже можно, если импортировать SYSTEM
Там проще позвать компилятор :-)
Название: Re: Higher-order function
Отправлено: Valery от Ноябрь 19, 2012, 02:52:24 pm
В Паскале указателей на функцию нет, а есть процедурный тип. Его реализация под капотом, скорее всего - тоже указатель, но ведь в самом языке его нет!
Стоп. А чем оно от оного указателя (или ссылки) отличается? Кроме названия в документации. Термины не интересны, интересна суть.

2. ИМХО функции высших порядков лучше всего смотреть в Лиспе. Там список и функция - близнецы-братья.
Возвращаемый список может быть функцией (списком) сформированным во время работы программы. И тут же во время работы программы эту функцию можно выполнить.
В императивном языке вроде Си нельзя во время программы сформировать функцию на Си и тут же ее выполнить. Как минимум потребуется вызов компилятора.
В случае именно что Си - не потребуется. То есть это сделать таки можно. Но, как водится, не портабельно.

Вот БлэкБокс (не Компонентный паскаль!) такое вроде позволяет... :)
Без вызова компилятора? Не верю :-)
1. Процедурный тип - это все же не указатель. Указатель - это машинно-ориентированный тип, а процедурный - это на уровне языка - от машины не зависит.
2. Наверное, в современном Си можно. А в С++ - никак.
3. Да, конечно, я имел ввиду, в БлэкБоксе, а не в языке.
Тем не менее, функции высших порядком - это ж практически объекты. Их можно создавать, передавать, получать, выполнять - и все это в процессе работы программы. А указатель на функцию - это машинно-ориентированный объект. 
Название: Re: Higher-order function
Отправлено: DIzer от Ноябрь 19, 2012, 03:07:30 pm
Процедурный тип - это все же не указатель.
Да, точнее не обязательно таковым является -  что это такое в  ЯВУ определяется его реализацией
Цитировать
Указатель - это машинно-ориентированный тип
Нет - все зависит от уровня его определения в конкретном ЯВУ
Цитировать
процедурный - это на уровне языка - от машины не зависит.
опять же зависит от уровня определения - как и остальные типы и их экземпляры(переменные)
Например -  классическое определение массива  в ЯВУ - набор однотипных переменных, к каждой из которых можно обратится по  номеру (индексу), и время доступа не зависит от номера переменной.. Низкоуровневое определение массива в языках среднего и низкого уровня ДЕКЛАРИРУЕТ еще и информацию о "структуре" переменной - например, как непрерывный набор ячеек в некотором адресном пространстве (СИ/C++)
Название: Re: Higher-order function
Отправлено: valexey_u от Ноябрь 19, 2012, 04:07:02 pm
1. Процедурный тип - это все же не указатель. Указатель - это машинно-ориентированный тип, а процедурный - это на уровне языка - от машины не зависит.
Давай не растекаться мыслью по дереву. Чем конкретно паскалевский процедурный тип от сишной функции (константный указатель на константу имеющий тип функции) отличается? Что можно сделать с одним такое чего нельзя сделать с другим, и наоборот.

2. Наверное, в современном Си можно. А в С++ - никак.
Почему? То есть я не вижу никаких проблем для плюсов - в данном случае там будет ровно то же что и в сях. (более того, я это делал, и видел как делают другие).

3. Да, конечно, я имел ввиду, в БлэкБоксе, а не в языке.
Тем не менее, функции высших порядком - это ж практически объекты. Их можно создавать, передавать, получать, выполнять - и все это в процессе работы программы. А указатель на функцию - это машинно-ориентированный объект.
Из пустого в порожнее получается :-) Понимаешь, если мы мыслим в терминах "все есть объект", то куда ни плюнь попадешь именно в объект (функция это, целочисленная переменная или что-то еще). Причем если смотреть с этой колокольни, то мы увидим объекты вообще в любом языке. Но есть нюанс - задекларировав что у нас все есть объект, знаний дополнительных не получаем.

PS. В твоем третьем пункте, видимо, стоит заменить "функции высших порядков" на просто функции. Ибо ФВП сама по себе какой-то дополнительной "объектностью" относительно просто функции не обладает.
Название: Re: Higher-order function
Отправлено: ilovb от Ноябрь 21, 2012, 09:28:38 am
Кстати просмотрел тут по диагонали главу 1.3  Formulating Abstractions with Higher-Order Procedures из SICP
http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-12.html#%_sec_1.3

Вроде как все примеры можно переписать на Oberon.
Название: Re: Higher-order function
Отправлено: Geniepro от Ноябрь 21, 2012, 09:38:02 am
Кстати просмотрел тут по диагонали главу 1.3  Formulating Abstractions with Higher-Order Procedures из SICP
http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-12.html#%_sec_1.3

Вроде как все примеры можно переписать на Oberon.

Если таки перепишите на Оберон, добавьте сюда:
http://sicp.org.ua/sicp/Section1-3
Я как-то начинал там примеры на обероне приводить, да запал быстро пропал почему-то...
Название: Re: Higher-order function
Отправлено: ilovb от Ноябрь 21, 2012, 09:41:22 am
OK, я и так планировал этим заняться. Но обещать не буду  :) Планы у меня наполеоновские как всегда, а возможности сильно ограничены.