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

Valery

  • Full Member
  • ***
  • Сообщений: 101
    • Просмотр профиля
Re: Higher-order function
« Ответ #45 : Ноябрь 16, 2012, 06:35:03 am »
Вставлю свои две копейки.
1. Указатель на функцию и функция - сильно разные вещи в императивных языках обычно. Указателя на функцию в языке может и не быть, а функции - по-любому присутствуют.
В Паскале указателей на функцию нет, а есть процедурный тип. Его реализация под капотом, скорее всего - тоже указатель, но ведь в самом языке его нет!
Путаница ИМХО пошла с Си, поскольку там было правило: имя функции = константа-указатель на функцию (того же типа).
2. ИМХО функции высших порядков лучше всего смотреть в Лиспе. Там список и функция - близнецы-братья.
Возвращаемый список может быть функцией (списком) сформированным во время работы программы. И тут же во время работы программы эту функцию можно выполнить.
В императивном языке вроде Си нельзя во время программы сформировать функцию на Си и тут же ее выполнить. Как минимум потребуется вызов компилятора.
Вот БлэкБокс (не Компонентный паскаль!) такое вроде позволяет... :)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Higher-order function
« Ответ #46 : Ноябрь 16, 2012, 07:11:02 am »
Вставлю свои две копейки.
1. Указатель на функцию и функция - сильно разные вещи в императивных языках обычно. Указателя на функцию в языке может и не быть, а функции - по-любому присутствуют.
В Паскале указателей на функцию нет, а есть процедурный тип. Его реализация под капотом, скорее всего - тоже указатель, но ведь в самом языке его нет!
Стоп. А чем оно от оного указателя (или ссылки) отличается? Кроме названия в документации. Термины не интересны, интересна суть.

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

Вот БлэкБокс (не Компонентный паскаль!) такое вроде позволяет... :)
Без вызова компилятора? Не верю :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Higher-order function
« Ответ #47 : Ноябрь 16, 2012, 08:28:15 am »
А на Си как? Типа сделать массив под размер кода функции, напихать туда динамически маш кодов, получить указатель на начало массива и вернуть это как функцию?  ;)

Я такое еще в школе на васике сооружал  ;D

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Higher-order function
« Ответ #48 : Ноябрь 16, 2012, 08:29:48 am »
А на Си как? Типа сделать массив под размер кода функции, напихать туда динамически маш кодов, получить указатель на начало массива и вернуть это как функцию?  ;)

Я такое еще в школе на васике сооружал  ;D
Угу. Это дело широко применяется для "jit-компиляции" всяких выражений прямо внутри программы. Например так можно собрать regexp который будет в результате нифига не интерпретироваться.
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Higher-order function
« Ответ #49 : Ноябрь 16, 2012, 08:31:36 am »
В ЧЯ в принципе тоже можно, если импортировать SYSTEM

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Higher-order function
« Ответ #50 : Ноябрь 16, 2012, 08:52:55 am »
В ЧЯ в принципе тоже можно, если импортировать SYSTEM
Там проще позвать компилятор :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

Valery

  • Full Member
  • ***
  • Сообщений: 101
    • Просмотр профиля
Re: Higher-order function
« Ответ #51 : Ноябрь 19, 2012, 02:52:24 pm »
В Паскале указателей на функцию нет, а есть процедурный тип. Его реализация под капотом, скорее всего - тоже указатель, но ведь в самом языке его нет!
Стоп. А чем оно от оного указателя (или ссылки) отличается? Кроме названия в документации. Термины не интересны, интересна суть.

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

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

DIzer

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

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Higher-order function
« Ответ #53 : Ноябрь 19, 2012, 04:07:02 pm »
1. Процедурный тип - это все же не указатель. Указатель - это машинно-ориентированный тип, а процедурный - это на уровне языка - от машины не зависит.
Давай не растекаться мыслью по дереву. Чем конкретно паскалевский процедурный тип от сишной функции (константный указатель на константу имеющий тип функции) отличается? Что можно сделать с одним такое чего нельзя сделать с другим, и наоборот.

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

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

PS. В твоем третьем пункте, видимо, стоит заменить "функции высших порядков" на просто функции. Ибо ФВП сама по себе какой-то дополнительной "объектностью" относительно просто функции не обладает.
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

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

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Higher-order function
« Ответ #55 : Ноябрь 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
Я как-то начинал там примеры на обероне приводить, да запал быстро пропал почему-то...
to iterate is human, to recurse, divine

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

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Higher-order function
« Ответ #56 : Ноябрь 21, 2012, 09:41:22 am »
OK, я и так планировал этим заняться. Но обещать не буду  :) Планы у меня наполеоновские как всегда, а возможности сильно ограничены.