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

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Higher-order function
« : Ноябрь 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)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Higher-order function
« Ответ #1 : Ноябрь 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)" ? ;-)
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Higher-order function
« Ответ #2 : Ноябрь 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 нет (операций сложения, вычитания, умножения и так далее).

Внимание вопрос - можно ли считать, что данный язык полноценно поддерживает концепцию целых чисел?
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

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

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Higher-order function
« Ответ #4 : Ноябрь 13, 2012, 04:07:03 pm »
Да я ж не шарю в сях. Ни строчки не писал  ;D
Ну пусть так.
Вопрос в другом: Это оно? Т.е. тупо указатель на функцию под глянцевым названием?
Таки нет. Я выше процитировал свои сообщения. Там вроде бы объясняется. Даже на примерах.

Просто указатель на функцию (даже типобезопасный) - это на уровне поддержки целых чисел без возможности их складывать, сравнивать, умножать и так далее.
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Higher-order function
« Ответ #5 : Ноябрь 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

Других определений я не встречал.  :)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Higher-order function
« Ответ #6 : Ноябрь 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, которые не могут вернуть ничего интересного?
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Higher-order function
« Ответ #7 : Ноябрь 13, 2012, 04:19:24 pm »
А чего такого интересного они могут вернуть, чего нельзя на том же Си?

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Higher-order function
« Ответ #8 : Ноябрь 13, 2012, 04:20:03 pm »
А чего такого интересного они могут вернуть, чего нельзя сделать на том же Си?
Например вернуть новую функцию :-) Которой до того не было.
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Higher-order function
« Ответ #9 : Ноябрь 13, 2012, 04:21:52 pm »
Что значит не было? Можно пример?

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Higher-order function
« Ответ #10 : Ноябрь 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 возвращает функцию которая будет возвращать одно и то же случайное число (кокое именно - определяется при генерации оной функции).
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Higher-order function
« Ответ #11 : Ноябрь 13, 2012, 04:46:55 pm »
Тык это ж замыкание вроде?!  ???

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Higher-order function
« Ответ #12 : Ноябрь 13, 2012, 04:49:27 pm »
Тык это ж замыкание вроде?!  ???
Замыкание - это не фунция высшего порядка :-) Это захват переменных из области видимости (захват в том смысле что можно с собою унести, в Обероне нет замыканий, хотя локальные функции могут использовать локальные переменные).

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

Короче, для полноценного 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
« Ответ #13 : Ноябрь 13, 2012, 04:56:19 pm »
Тык это ж замыкание вроде?!  ???
Замыкание - это не фунция высшего порядка :-)
Ну и я ровно о том же.

Или ты хочешь сказать что HOF без замыканий не HOF?! (и хде такое утверждается у аццов ФП?)
По мне так наоборот замыкания без HOF не могут быть.  :)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Higher-order function
« Ответ #14 : Ноябрь 13, 2012, 05:00:41 pm »
Тык это ж замыкание вроде?!  ???
Замыкание - это не фунция высшего порядка :-)
Ну и я ровно о том же.

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

Это просто из личной практики применения всего этого.
Y = λf.(λx.f (x x)) (λx.f (x x))