Lifted function
От: Sinclair Россия https://github.com/evilguest/
Дата: 29.06.09 07:45
Оценка: 30 (1)
Вот, встрял в связи с http://blogs.msdn.com/ericlippert/archive/2009/06/18/use-your-legs-not-your-back.aspx.
Пытаюсь придумать удачный перевод термину lifted operator в C#.
Вроде бы термин заимствован из математики, где есть понятие lifted function (http://blogs.msdn.com/ericlippert/archive/2007/06/27/what-exactly-does-lifted-mean.aspx); но в нашем курсе я такого не помню, и гугл не помог. Математики, подскажите — есть ли готовый термин на русском для функций, расширенных описываемым способом?
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Lifted function
От: Alex Reyst Россия  
Дата: 29.06.09 09:10
Оценка: 96 (1)
Здравствуйте, Sinclair, Вы писали:

S> есть ли готовый термин на русском для функций, расширенных описываемым способом?


Видимо, речь о частном случае накрывающей функции. Она, правда, lifting, а не lifted, но по описанию вроде бы самое оно. В любом случае, речь не о точном соответствии математическому понятию.

Кстати, по тексту непонятно подразумеваемое поведение lifted function в случае выхода аргументов за пределы области определения — по ссылке (2) с одной стороны функция должна "maps everything else onto null", однако с другой стороны из авторского определения следует, что никакого everything else быть просто не может.

См. начиная от http://en.wikipedia.org/wiki/Homotopy_lifting_property
Все, что здесь сказано, может и будет использоваться против меня.
Re[2]: Lifted function
От: Sinclair Россия https://github.com/evilguest/
Дата: 29.06.09 09:50
Оценка:
Здравствуйте, Alex Reyst, Вы писали:
AR>Видимо, речь о частном случае накрывающей функции. Она, правда, lifting, а не lifted, но по описанию вроде бы самое оно. В любом случае, речь не о точном соответствии математическому понятию.
Хм. Там вроде бы lifting property, так что ничего страшного в lifted function нет — связь явно прослеживается.

AR>Кстати, по тексту непонятно подразумеваемое поведение lifted function в случае выхода аргументов за пределы области определения — по ссылке (2) с одной стороны функция должна "maps everything else onto null", однако с другой стороны из авторского определения следует, что никакого everything else быть просто не может.

Имеется в виду, что для N аргументов есть, очевидно, 2^N-1 комбинаций значений, в которых участвует null. Все эти комбинации lifted function отображает в null — они и есть everything else; для случая N=1, очевидно, everything else соответствует ровно одному значению.
AR>См. начиная от http://en.wikipedia.org/wiki/Homotopy_lifting_property
Нда, копец. Давно не брал я в руки шашек.

Ладно. А про остальные можешь посоветовать — raise, hoist? Ну, raise event, положим, это "возбуждать событие", хотя я чего-то не вижу канонизированного перевода в MSDN.А hoist вообще впервые встречаю. Просто ужас, сколько эти англоязычники придумали синонимов термину "поднять".
а у нас кроме http://ru.wiktionary.org/wiki/%D0%BF%D0%BE%D0%B4%D0%BD%D1%8F%D1%82%D1%8C и нет ничего.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Lifted function
От: Кодт Россия  
Дата: 29.06.09 09:59
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Вот, встрял в связи с http://blogs.msdn.com/ericlippert/archive/2009/06/18/use-your-legs-not-your-back.aspx.

S>Пытаюсь придумать удачный перевод термину lifted operator в C#.
S>Вроде бы термин заимствован из математики, где есть понятие lifted function (http://blogs.msdn.com/ericlippert/archive/2007/06/27/what-exactly-does-lifted-mean.aspx); но в нашем курсе я такого не помню, и гугл не помог. Математики, подскажите — есть ли готовый термин на русском для функций, расширенных описываемым способом?

Лифт в C# — это частный случай лифта функции в монаду Maybe (в роли которой выступает nullable).
В Хаскелле лифт выглядит так
liftM f mx = do
    x <- mx
    return f x

liftM2 f mx my = do
    x <- mx
    y <- my
    return f x y


Применительно к монадам List и Set это, соответственно,
lf(X) = { f(x) | x in X }
lf(X,Y) = { f(x,y) | (x,y) in X*Y }

А применительно к State и ему подобным (IO, Reader),
lf(S x) = S(f x)
только выносит конструктор типа за скобки. Про нулевые значения (null, Nothing, [], {}) здесь речь не идёт.

Не знаю, насколько здесь применимы термины из топологии, хотя конечно, всё это ходит рядом с теорией категорий.
Может, какое чтиво по Хаскеллу стоит привлечь?
... << RSDN@Home 1.2.0 alpha 4 rev. 1207>>
Перекуём баги на фичи!
Re[3]: Lifted function
От: Alex Reyst Россия  
Дата: 29.06.09 10:06
Оценка:
Здравствуйте, Sinclair, Вы писали:

AR>> с другой стороны из авторского определения следует, что никакого everything else быть просто не может.

S>Имеется в виду

По определению A' = A OR { null }, т.е. everything else тождественно эквивалентно null. Я перечитал сейчас — мысль выражена логически корректно, но несколько витиевато.
Все, что здесь сказано, может и будет использоваться против меня.
Re[3]: Lifted function
От: Кодт Россия  
Дата: 29.06.09 10:11
Оценка:
Здравствуйте, Sinclair, Вы писали:

AR>>Кстати, по тексту непонятно подразумеваемое поведение lifted function в случае выхода аргументов за пределы области определения — по ссылке (2) с одной стороны функция должна "maps everything else onto null", однако с другой стороны из авторского определения следует, что никакого everything else быть просто не может.

S>Имеется в виду, что для N аргументов есть, очевидно, 2^N-1 комбинаций значений, в которых участвует null. Все эти комбинации lifted function отображает в null — они и есть everything else; для случая N=1, очевидно, everything else соответствует ровно одному значению.

C# — это эклектика, в отличие от тру языков (то есть хаскелла).
А если взять кортеж списков (а не nullable-значений) — так у нас вообще счётность на ровном месте образуется.
Не надо бояться комбинаторного взрыва, для Maybe-подобных монад всё выглядит просто. Так же, как для конъюнкции булевых значений.
if(x1 is null) return null;
if(x2 is null) return null;
if(x3 is null) return null;
.....
return f(x1,x2,x3,.....)


AR>>См. начиная от http://en.wikipedia.org/wiki/Homotopy_lifting_property

S>Нда, копец. Давно не брал я в руки шашек.
http://en.wikipedia.org/wiki/Lift_(mathematics) и далее по теории категорий.



Можно ввести собственный термин "поднятая функция" (по аналогии с Поднятой целиной) и не париться. А если что, сделать отсылки к английским терминам и в заумь — к гомотопиям. Пускай народ разбирается сам.
... << RSDN@Home 1.2.0 alpha 4 rev. 1207>>
Перекуём баги на фичи!
Re[2]: Lifted function
От: Alex Reyst Россия  
Дата: 29.06.09 10:13
Оценка: +1
Здравствуйте, Кодт, Вы писали:

К> всё это ходит рядом с теорией категорий


Ну, если отвлечься от некоторой неопределенности круга вопросов, входящих в "теорию категорий", то это собственно оно и есть. Первые же ссылки по "накрывающей функции" выводят на Понтрягина (см. "накрывающее отображение").
Все, что здесь сказано, может и будет использоваться против меня.
Re[4]: Lifted function
От: Sinclair Россия https://github.com/evilguest/
Дата: 29.06.09 10:25
Оценка: +1
Здравствуйте, Alex Reyst, Вы писали:

AR>По определению A' = A OR { null }, т.е. everything else тождественно эквивалентно null.

Нет. Читай про "Similarly, if we had a two-argument function f" и далее.
AR>Я перечитал сейчас — мысль выражена логически корректно, но несколько витиевато.
Не вижу ничего витиеватого. "Принимаем nullы, всегда согласуемся с накрытой версией, когда аргументы не null, возвращаем null во всех остальных случаях".
Возьмём целую функцию четырёх целых аргументов, int F(int a, int b, int c, int d) => a + b + c + d.
Для неё накрывающая функция должна работать так:
lF(int a, int b, int c, int d) => F(a, b, c, d) = a + b + c + d;
lF(null, int b, int c, int d) => null
lF(int a, null, int c, int d) => null
lF(null, null, int c, int d) => null
и так далее еще 12 раз. Математик никогда не стал бы говорить "return null for the null arguments", потому что это описывает только 1 случай из 2^N-1: (null, null, null, ..., null).
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: Lifted function
От: Alex Reyst Россия  
Дата: 29.06.09 10:44
Оценка: 93 (1)
Здравствуйте, Sinclair, Вы писали:

S>А про остальные можешь посоветовать — raise, hoist?


Перечитал. Если lifted == накрывающая, то в терминах глаголов получается:

In C# you can "lift", "raise" and "hoist"


to lift — накрыть
to raise — поднять, активизировать, запустить, инициировать
to hoist — вытянуть

S> сколько эти англоязычники придумали синонимов термину "поднять"


Нет, просто немного принципы формирования терминов немного разные. У нас тоже синонимов к "поднять" выше крыши . Нужно быть просто чуть смелее — обрати внимание, "hoist" автор в кавычках пишет, т.е. это нововведение автора/некоторых узких кругов, а не некоторое общепринятое использование слова. Это как раз тот случай, когда у тебя все козыри в руках, не стесняйся .
Все, что здесь сказано, может и будет использоваться против меня.
Re[5]: Lifted function
От: Alex Reyst Россия  
Дата: 29.06.09 10:52
Оценка:
Здравствуйте, Sinclair, Вы писали:

AR>>По определению

S>Нет

Прости, глаз второпях проехал мимо абзаца про two-argument function.
Все, что здесь сказано, может и будет использоваться против меня.
Re[5]: Lifted function
От: Кодт Россия  
Дата: 29.06.09 11:04
Оценка: 16 (1) :)
Здравствуйте, Sinclair, Вы писали:

S>и так далее еще 12 раз. Математик никогда не стал бы говорить "return null for the null arguments", потому что это описывает только 1 случай из 2^N-1: (null, null, null, ..., null).


return null for any null argument?

Можно вообще исключить нули из описания.
Для этого достаточно перейти в категорию Set.

Отображаем nullable в множество (пустое или одноэлементное).
Кортеж аргументов превращается в их декартово произведение — множество кортежей значений (пустое или одноэлементное); правила декартова произведения нам как бы известны?
Поднятая функция отображает множество в множество (опять же, пустое или одноэлементное).

Таким образом, нули остались только в скобках.
... << RSDN@Home 1.2.0 alpha 4 rev. 1207>>
Перекуём баги на фичи!
Re[6]: Lifted function
От: Alex Reyst Россия  
Дата: 29.06.09 11:22
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Таким образом


Прокомментирую свой смайлик: текст по форме очень похож на корчевателя .
Все, что здесь сказано, может и будет использоваться против меня.
Re[4]: Lifted function
От: Кодт Россия  
Дата: 29.06.09 11:49
Оценка:
Здравствуйте, Alex Reyst, Вы писали:

AR>Нет, просто немного принципы формирования терминов немного разные. У нас тоже синонимов к "поднять" выше крыши . Нужно быть просто чуть смелее — обрати внимание, "hoist" автор в кавычках пишет, т.е. это нововведение автора/некоторых узких кругов, а не некоторое общепринятое использование слова. Это как раз тот случай, когда у тебя все козыри в руках, не стесняйся .


"hoist" — берём какой-нибудь уже существующий функциональный язык, в котором используется связывание локальных переменных — и тащим терминологию оттуда.

"lift" — с одной стороны, lifted mapping|function — накрывающее отображение, но с другой, lifting — поднятие пути.
Как-то нехорошо вышло, что в английском у нас герундий и пассив, а в русском герундий и (опаньки!) актив. Это примерно как с dependency
Впрочем, поскольку сам морфизм lift в языке C# не существует самостоятельно, то можем закрыть на это глаза.

"raise" — используется же термин "возбуждение" (возбудить событие, возбудить исключение) — чем он не подходит? Есть какая-то тонкость?
... << RSDN@Home 1.2.0 alpha 4 rev. 1207>>
Перекуём баги на фичи!
Re[5]: Lifted function
От: Alex Reyst Россия  
Дата: 29.06.09 12:04
Оценка:
Здравствуйте, Кодт, Вы писали:

К>"hoist" — берём какой-нибудь уже существующий функциональный язык, в котором используется связывание локальных переменных — и тащим терминологию оттуда.


Дай пожалуйста примеры по этому поводу в текстах про функциональные языки.

К>"lift" — с одной стороны, lifted mapping|function — накрывающее отображение, но с другой, lifting — поднятие пути.


Автор сам связал использование слова lifted с его использованием во вполне определенном разделе математики. И там только "накрывающий".

К>"raise" — используется же термин "возбуждение" (возбудить событие, возбудить исключение) — чем он не подходит? Есть какая-то тонкость?


Нет, подходит. Просто Sinclair вполне справедливо заметил: несмотря на давность использования слова, четко определенного перевода для него нет. Для меня "инициировать" лучше, чем "возбудить" — но просто может быть, у меня слишком пуританские взгляды ?
Все, что здесь сказано, может и будет использоваться против меня.
Re[6]: Lifted function
От: Кодт Россия  
Дата: 29.06.09 13:46
Оценка: 16 (1)
Здравствуйте, Alex Reyst, Вы писали:

К>>"hoist" — берём какой-нибудь уже существующий функциональный язык, в котором используется связывание локальных переменных — и тащим терминологию оттуда.


AR>Дай пожалуйста примеры по этому поводу в текстах про функциональные языки.


нифига не авторитетный источник — "свободная переменная, захваченная из контекста"

Порылся в гугле, чтобы посмотреть, какими англоязычными словами пользуются — to bind, to capture a free variable.

Но похоже, что действительно, устоявшегося термина для передачи локальной переменной в составе замыкания наружу — нет.
... << RSDN@Home 1.2.0 alpha 4 rev. 1207>>
Перекуём баги на фичи!
Re[3]: Lifted function
От: Alex Reyst Россия  
Дата: 29.06.09 19:00
Оценка: +1
Здравствуйте, Sinclair, Вы писали:

S> Просто ужас, сколько эти англоязычники придумали синонимов термину "поднять".


Я неполно выразил свою мысль, позволю себе докинуть пять копеек.
Коннотации, существующие в литературном языке, совсем необязательно соответствуют таковым у терминов. Например, слову head в различных терминологических областях могут соответствовать не только достаточно близкие по некоторому общему смыслу "голова", "шапка", "крышка" и т.п., но и достаточно далекие по обыденному смыслу слова "нос", "исток", "давление" и т.п. И то, что в переводимом тобой тексте обыгрывается общая смысловая составляющая слов lift, raise, hoist — передать на русском языке не только затруднительно, но и по большому счету просто не необходимо. Если бы это был художественный текст, можно было бы заняться подбором синонимов к "поднять" — это совершенно не проблема; но в данном случае важнее сохранить связи с уже существующими в русском языке терминами — если они есть (для lift и raise) или взять на себя смелость ввести новый (для hoist). Здесь решение за тобой: ты взялся за интересную, но трудную работу — тексты таковы, что без терминотворчества просто не обойтись. Здесь нужно и владение языком, и практика перевода, и отличное понимание предметной области. Я бы на подобное не рискнул, поэтому воленс-ноленс выступаю в роли комедийного консультанта, способного максимум тыкнуть в нужном направлении:

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

Все, что здесь сказано, может и будет использоваться против меня.
Re[6]: Lifted function
От: Sinclair Россия https://github.com/evilguest/
Дата: 30.06.09 03:10
Оценка:
Здравствуйте, Кодт, Вы писали:
К>return null for any null argument?
return null for any combination of arguments where one or more of arguments equals null.

К>Отображаем nullable в множество (пустое или одноэлементное).
К>Кортеж аргументов превращается в их декартово произведение — множество кортежей значений (пустое или одноэлементное); правила декартова произведения нам как бы известны?
К>Поднятая функция отображает множество в множество (опять же, пустое или одноэлементное).
Это всё понятно. Осталось описать правила, по которым функция обязана отображать декартово произведение множеств значений аргументов, расширенных при помощи null элемента, в аналогичным образом расширенное множество значений. Потому, что очевидно наличие бесконечного множества таких функций, всё еще совпадающих с накрытой на всей области её определения.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[7]: Lifted function
От: Кодт Россия  
Дата: 30.06.09 09:56
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Это всё понятно. Осталось описать правила, по которым функция обязана отображать декартово произведение множеств значений аргументов, расширенных при помощи null элемента, в аналогичным образом расширенное множество значений. Потому, что очевидно наличие бесконечного множества таких функций, всё еще совпадающих с накрытой на всей области её определения.


Ну, правила-то описаны. Есть законы, которым удовлетворяют функторы и монады.
Вопрос лишь в том, нужно ли пугать незамутнённого пользователя C# всеми теми вещами, которые составляют порог вхождения в Хаскелл.

Если бы я был царь, то я сказал бы следующее:

Пусть некий тип представляет множество допустимых значений (числовой тип — какой-то отрезок числовой оси; класс — объекты этого класса; и т.п.)
Этот тип расширяется специальным исключительным значением (NaN, null).
Тогда уже существующие операции над исходным типом/типами (одноместные, двуместные, сколько-угодно-местные) расширяются интуитивно понятным способом: если любой аргумент принимает исключительное значение, то и результат — тоже исключительное значение.

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

Для любителей точных наук — процедура расширения называется "поднятием пути" (lifting), а расширенная операция — "накрывающим отображением" (lifted function).
(Ну и дальше ссылки на Понтрягина, Yet Another Haskell Tutorial; иллюстрации поднятия из Id в Set, из Maybe в Set и прочее по вкусу).

... << RSDN@Home 1.2.0 alpha 4 rev. 1207>>
Перекуём баги на фичи!
Re[4]: Lifted function
От: BulatZiganshin  
Дата: 03.07.09 13:09
Оценка:
Здравствуйте, Alex Reyst, Вы писали:

AR>

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



"... да и то вряд ли"
Люди, я люблю вас! Будьте бдительны!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.