Re[7]: Try из библиотеки LanguageExt.Core
От: samius Япония http://sams-tricks.blogspot.com
Дата: 18.01.22 02:21
Оценка: 24 (2)
Здравствуйте, vaa, Вы писали:

vaa>Здравствуйте, samius, Вы писали:


S>>Ниже пример того, что в замыкании участвует именно общая переменная, а не значение на момент определения замыкания.

vaa>да, тупанул, действительно сложнее реализовать именно поведение лямбды

vaa>Получается через лямбда-синтаксис выразить лямбду невозможно?

Бррр...

В C#, раз речь о нем, лямбдой называется короткий способ записи функции. В базе любую функцию (на самом деле, нет), можно записать в виде лямбда выражения/оператора.
Что нельзя записать — функции, использующие unsafe, передачу параметров по ссылке и что-то еще. Здесь и сейчас это не важно. Для простоты будем считать, что любую.

С лямбдой на этом всё. Это способ записи, причем, мы всегда можем записать функцию по-другому. Например, delegate может описывать функции там же, где и лямбда.
Далее про лямбду можно забыть вовсе, она не интересна. Это просто сахар и только, у сахара нет поведения, которое можно наблюдать. Единственное, что мы можем наблюдать — так это то, что функция, записанная через лямбду, будет вести себя так же,как и функция, записанная делегатом или как-то еще.

Поэтому, выражение "через лямбда-синтаксис выразить лямбду" выгляидит (с точки зрения C#, повторюсь) как "через функцию выразить функцию". Что странно выглядит в одном утверждении со словом "невозможно".

Но если мы говорим о лямбда-исчислении и о том, что не всякую лямбду из лямбда-исчисления можно выразить в C#, то да, это справедливо. Но справедливо слишком, т.к. у нас разные системы типизации. Без конкретики сложно поддерживать беседу.

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

В последнем параграфе для лямбды не нашлось места вовсе. Все, что справедливо для функций, будет справедливо и для лямбд (в рамках C#).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.