LINUX.ORG.RU

Чистота. Что-то тут не так.

 , ,


0

2

Любопытная аналогия между ФП функциями, и математическими дробями.

Кагда мы пишем, например две дроби, например, для простоты, 1/2 и 1/2, мы абстрагируемся от оъектов, от которых мы их берем. Например, опять же для простоты, возьмем листы бумаги. Совершенно непонятно, например, идет ли здесь речь о разных листах или об одном? Одинаковые листы это или разные. Отсюда следует, что мы не можем просто так сложить эти дроби, не конкретизировав, сначала, о чем речь.

Для ФП, такой конкретизацией является общий контекст замыканий - в простом случае - глобальная область видимости. Пока все норм. Идем дальше.

Реальные приложения, это как известно, не застывшие раз и на всегда глыбы (даже глыбы иногда ломаются, да), а динамика. Значит, то что было когда то а=foo, станет a=bar. Программе все равно придется взаимодействовать с внешним миром.

Если у нас есть присваивания, мы поступим очень просто - перезапишем значение a в глобале.

Что же тогда становится с иммутабельныи замыканиями? Насколько я понимаю, единственный выход тут, полностью скопировать их и перезаписать все имена a. А что же тогда делать со старыми замыканиями? Выкинуть на помойку? Понятно, что если нам необходим возврат к старому состоянию, да, это нужно. И мы, тащемта, при таком подходе, всегда, вообще, можем вернуться к любому состоянию, это cool, никто не спорит. Но в остальных то случаях, мы получаем громадный перерасход памяти, и больше них-я?



Последнее исправление: anonimous (всего исправлений: 2)
Ответ на: комментарий от vonenij

функция, которая ссылается на свободные переменные в своём контексте.

Я не знаю, откуда ты выдрал это определение, но правильно будет не

которая ссылается на свободные

а

свободные переменные которой ссылаются на биндинги своего контекста.

Это во первых. Во-вторых, тут речь не о замыканиях вообще, а об иммутабельных замыканиях.

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

Нет, мы с PolarFox говорили о CL и кожуре. Это было лирическое отступление

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

ВНЕЗАПНО, это википедия

Ящетаю, данное определение некорректно, оно искажает смысл, в любом случае. Мое определение верно.

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

Функция, которая возвращается из замыкания

Эта функция тоже возвращается из замыкания:

double = (* 2)

А вдруг ты прав? Можешь привести доказательства?

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

Иди хоть на википедию. В 2 словах: safety - это когда твоя прога никогда не упадет или не будет работать непредвиденным образом, security - это то, что твою систему не пожрут троянчики, то, что твоя прога не выдаст важные данные итд

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

Это каррирование, насколько я понял (синтаксис хаскеля не знаю если чо), и конечно, каррирование использует замыкание:


(define curry
  (lambda(x)
    (lambda(y)
      (* x y))))
(define sum2 (curry 2))
(write (sum2 2))

anonimous
() автор топика
Ответ на: комментарий от vonenij

Ну дык, в контексте обсуждаемой темы, актуально только первое, да и то с натяжкой, второе - это вообще притянуто за уши, это скорей не к программированию относиться, в смысле семантики, а к архитектурам.

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

Ну я не вижу ничего опасного в изменении мутабельного объекта где-то ещё. Хоть это и не в стиле ФП. Потому что PolarFox делал акцент на «безопасной передаче ссылки», а не ФП

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

Вряд ли там замыкание.

Там оно, просто сахар.

add x y = x + y

то же самое, только без смысла, мож там тип add, я хз, только так смысл можно отыскать этой конструкции.

anonimous
() автор топика
Ответ на: комментарий от vonenij

не вижу ничего опасного в изменении мутабельного объекта

Значит, от тебя ускользает весь смысл (основной) ФП.

акцент на «безопасной передаче ссылки», а не ФП

Это и есть оно самое, ФП. Куда ты ссылаешься? Сейчас это foo а через секунду - bar. Где твоя безопасность?

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

Там оно, просто сахар.

Ты не понял. Это частичное применение, да. Только я сомневаюсь, что для литерала (2) будет создано замыкание.

то же самое, только без смысла, мож там тип add,

Это значит функция add, которая складывает x и y.

Короче, я готов тебе верить, но только после пруфа.

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

Повторить ещё раз, что мы говорили не о ФП.

Конкретно в контексте твоего треда я согласен с тобой

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

будет создано замыкание.

Да оно не будет, оно уже создано, на уровне либы или самого языка.

Это значит функция add, которая складывает x и y.

Ну, дык это ж обычное определение ф-ции. Для этого не нужно замыкания. Замыкание имеет смысл, только тогда, когда в твоей ф-ции используются свободные переменные. А тут ты явно передаешь параметры.

Но на концептуальном, какбэ, уровне, ты все равно будешь действовать в контексте. Глобал тоже пользуется своим контекстом, где символы 1, 2, и прочие имеют именно то значение, в которое они вычисляются. Но это сахар языка уже.

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

Ну, дык это ж обычное определение ф-ции. Для этого не нужно замыкания. Замыкание имеет смысл, только тогда, когда в твоей ф-ции используются свободные переменные. А тут ты явно передаешь параметры.

Наконец-то! Отлично! А как ты тогда прокомментируешь это:

Чистота. Что-то тут не так. (комментарий)

Что ты хотел этим сказать?

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

оно уже создано, на уровне либы или самого языка.

Чего?

Замыкание создается когда есть объект извне, so to speak. Тут просто литерал.

Это тебя не смущает?

double x = x + 2

Тогда почему смущает это?

double = (+) 2

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

Сотри вторую часть сообщения. На концетуальном уровне, примитивы ФП - это возврат из окружения, только окружение это создано не тобой, как и в случае твоего каррирования.

Когда ты передаешь свои параметры, в функцию, например 1, символ 1 вычисляется в значение, которое определено на уровне языка, и оно, уже присутствует в скопе твоего замыкания, поскольку глобал всегда является частью всех локальных скопов.

anonimous
() автор топика
Ответ на: комментарий от vonenij

Замыкание создается когда есть объект извне

Нет, в ФП, при создании любой функции создается замыкание. Все значения символов берутся из контекста создания.

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

Но на концептуальном, какбэ, уровне, ты все равно будешь действовать в контексте. Глобал тоже пользуется своим контекстом, где символы 1, 2, и прочие имеют именно то значение, в которое они вычисляются. Но это сахар языка уже.

На концептуальном уровне 1, 2 - это литералы. Их не обязательно становиться некими объектами. Код x+2 может быть преобразован тупо в add r1, 2. Натянутый пример, но всё же.

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

Когда ты передаешь свои параметры, в функцию, например 1, символ 1 вычисляется в значение, которое определено на уровне языка, и оно, уже присутствует в скопе твоего замыкания, поскольку глобал всегда является частью всех локальных скопов.

Отлично, теперь ты противоречишь сам себе (2 раз):

Ну, дык это ж обычное определение ф-ции. Для этого не нужно замыкания. Замыкание имеет смысл, только тогда, когда в твоей ф-ции используются свободные переменные. А тут ты явно передаешь параметры.

ЗЫ. Обращение к глобальным переменным - это не замыкание. Вики:

Замыкание связывает код функции с её лексическим окружением (местом, в котором она определена в коде). Лексические переменные замыкания отличаются от глобальных переменных тем, что они не занимают глобальное пространство имён. От переменных в объектах они отличаются тем, что привязаны к функциям, а не объектам.

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

это не замыкания

Это не замыкания, а часть скопа замыкания (в контексте которого вызывается ф-ция).

anonimous
() автор топика
Ответ на: комментарий от vonenij

То есть пруфца у тебя нет, и ты слился?

Я могу тебе код накидать чуть позже, мне жрать надо. Накидать?

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

In programming languages, a closure (also lexical closure or function closure) is a function or reference to a function together with a referencing environment—a table storing a reference to each of the non-local variables (also called free variables or upvalues) of that function.[1] A closure—unlike a plain function pointer—allows a function to access those non-local variables even when invoked outside its immediate lexical scope.

Соответственно, обращение к аргументам или глобальным переменным - НЕ замыкание.

Тут их нет: mathFunc1 x y = 2*x + y — использует только x и y из входных аргументов

А тут есть: addSomething x = \y -> x + y — использует x из лексического контекста

В частичном применение может есть тоже, я не знаю, как оно там устроено

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

Нет, это не так. И от того, как ты это назовешь, дело не изменится

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

Нет, мне нужен не твой код, а пруфец.

Статья из авторитетного источника, которая пишет: «Breaking news! All functions are actually closures in functional programming». В крайнем случае цитата из википедии

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

обращение к аргументам или глобальным переменным - НЕ замыкание.

Обращение - не замыкание. Но свободные переменные твоей ф-ции ищут значения этих переменных в контексте замыкания.

anonimous
() автор топика
Ответ на: комментарий от vonenij

Нет, мне нужен не твой код, а пруфец.

Я гляжу, ты буквоед. Суть дела тебя не интересует, вникать самостоятельно ты не хочешь, поэтому, защитывай слив, не вижу смысла напрягаться.

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

Обращение - не замыкание. Но свободные переменные твоей ф-ции ищут значения этих переменных в контексте замыкания.

Нет, обычно они находят их на стеке/в регистрах. Замыкания в куче. Надеюсь, это понятно.

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

Это ты защитывай слив. Кто что-то утверждает, тот должен дать пруфец

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

Что можно ожидать от такого мудака как ты? Не смог дать пруф и начал переходить на личности. Тогда я тоже буду так.

Ты как царь, только почему-то у тебя нет своей школы скила. Я бы записался just for lulz

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

Нах ты мне нужно ..-ло, тебе пруфы давать с твоими плюсами мозга. Любой дегенерат понял бы, пол треда об одном и том же. Ладно я, спецы тебе в твое дерево вбивали элементарщину. Иди подрочи на свои стеки и кучи лучше, ты не способен понять ниче

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

Я достаю свой член из твоего черепа и имею тебя в ухо своим грязным пальцем левой ноги

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

Я уступаю тебе своё место. А то забан уже летит :)

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

Да надо предложение внести — не банить общающихся с anonimous. Так как, общаясь с этим клоуном, сложно оставаться в рамках приличий.

sleepflint ★★★
()
Последнее исправление: sleepflint (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.