Здравствуйте, Sinclair, Вы писали:
S> есть ли готовый термин на русском для функций, расширенных описываемым способом?
Видимо, речь о частном случае накрывающей функции. Она, правда, lifting, а не lifted, но по описанию вроде бы самое оно. В любом случае, речь не о точном соответствии математическому понятию.
Кстати, по тексту непонятно подразумеваемое поведение lifted function в случае выхода аргументов за пределы области определения — по ссылке (2) с одной стороны функция должна "maps everything else onto null", однако с другой стороны из авторского определения следует, что никакого everything else быть просто не может.
Здравствуйте, 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>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Лифт в 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, [], {}) здесь речь не идёт.
Не знаю, насколько здесь применимы термины из топологии, хотя конечно, всё это ходит рядом с теорией категорий.
Может, какое чтиво по Хаскеллу стоит привлечь?
Здравствуйте, Sinclair, Вы писали:
AR>> с другой стороны из авторского определения следует, что никакого everything else быть просто не может. S>Имеется в виду
По определению A' = A OR { null }, т.е. everything else тождественно эквивалентно null. Я перечитал сейчас — мысль выражена логически корректно, но несколько витиевато.
Все, что здесь сказано, может и будет использоваться против меня.
Здравствуйте, 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,.....)
Можно ввести собственный термин "поднятая функция" (по аналогии с Поднятой целиной) и не париться. А если что, сделать отсылки к английским терминам и в заумь — к гомотопиям. Пускай народ разбирается сам.
Здравствуйте, Кодт, Вы писали:
К> всё это ходит рядом с теорией категорий
Ну, если отвлечься от некоторой неопределенности круга вопросов, входящих в "теорию категорий", то это собственно оно и есть. Первые же ссылки по "накрывающей функции" выводят на Понтрягина(см. "накрывающее отображение").
Все, что здесь сказано, может и будет использоваться против меня.
Здравствуйте, 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>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>А про остальные можешь посоветовать — raise, hoist?
Перечитал. Если lifted == накрывающая, то в терминах глаголов получается:
In C# you can "lift", "raise" and "hoist"
to lift — накрыть
to raise — поднять, активизировать, запустить, инициировать
to hoist — вытянуть
S> сколько эти англоязычники придумали синонимов термину "поднять"
Нет, просто немного принципы формирования терминов немного разные. У нас тоже синонимов к "поднять" выше крыши . Нужно быть просто чуть смелее — обрати внимание, "hoist" автор в кавычках пишет, т.е. это нововведение автора/некоторых узких кругов, а не некоторое общепринятое использование слова. Это как раз тот случай, когда у тебя все козыри в руках, не стесняйся .
Все, что здесь сказано, может и будет использоваться против меня.
Здравствуйте, 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 в множество (пустое или одноэлементное).
Кортеж аргументов превращается в их декартово произведение — множество кортежей значений (пустое или одноэлементное); правила декартова произведения нам как бы известны?
Поднятая функция отображает множество в множество (опять же, пустое или одноэлементное).
Здравствуйте, Alex Reyst, Вы писали:
AR>Нет, просто немного принципы формирования терминов немного разные. У нас тоже синонимов к "поднять" выше крыши . Нужно быть просто чуть смелее — обрати внимание, "hoist" автор в кавычках пишет, т.е. это нововведение автора/некоторых узких кругов, а не некоторое общепринятое использование слова. Это как раз тот случай, когда у тебя все козыри в руках, не стесняйся .
"hoist" — берём какой-нибудь уже существующий функциональный язык, в котором используется связывание локальных переменных — и тащим терминологию оттуда.
"lift" — с одной стороны, lifted mapping|function — накрывающее отображение, но с другой, lifting — поднятие пути.
Как-то нехорошо вышло, что в английском у нас герундий и пассив, а в русском герундий и (опаньки!) актив. Это примерно как с dependency
Впрочем, поскольку сам морфизм lift в языке C# не существует самостоятельно, то можем закрыть на это глаза.
"raise" — используется же термин "возбуждение" (возбудить событие, возбудить исключение) — чем он не подходит? Есть какая-то тонкость?
Здравствуйте, Кодт, Вы писали:
К>"hoist" — берём какой-нибудь уже существующий функциональный язык, в котором используется связывание локальных переменных — и тащим терминологию оттуда.
Дай пожалуйста примеры по этому поводу в текстах про функциональные языки.
К>"lift" — с одной стороны, lifted mapping|function — накрывающее отображение, но с другой, lifting — поднятие пути.
Автор сам связал использование слова lifted с его использованием во вполне определенном разделе математики. И там только "накрывающий".
К>"raise" — используется же термин "возбуждение" (возбудить событие, возбудить исключение) — чем он не подходит? Есть какая-то тонкость?
Нет, подходит. Просто Sinclair вполне справедливо заметил: несмотря на давность использования слова, четко определенного перевода для него нет. Для меня "инициировать" лучше, чем "возбудить" — но просто может быть, у меня слишком пуританские взгляды ?
Все, что здесь сказано, может и будет использоваться против меня.
Здравствуйте, Alex Reyst, Вы писали:
К>>"hoist" — берём какой-нибудь уже существующий функциональный язык, в котором используется связывание локальных переменных — и тащим терминологию оттуда.
AR>Дай пожалуйста примеры по этому поводу в текстах про функциональные языки.
Здравствуйте, Sinclair, Вы писали:
S> Просто ужас, сколько эти англоязычники придумали синонимов термину "поднять".
Я неполно выразил свою мысль, позволю себе докинуть пять копеек.
Коннотации, существующие в литературном языке, совсем необязательно соответствуют таковым у терминов. Например, слову head в различных терминологических областях могут соответствовать не только достаточно близкие по некоторому общему смыслу "голова", "шапка", "крышка" и т.п., но и достаточно далекие по обыденному смыслу слова "нос", "исток", "давление" и т.п. И то, что в переводимом тобой тексте обыгрывается общая смысловая составляющая слов lift, raise, hoist — передать на русском языке не только затруднительно, но и по большому счету просто не необходимо. Если бы это был художественный текст, можно было бы заняться подбором синонимов к "поднять" — это совершенно не проблема; но в данном случае важнее сохранить связи с уже существующими в русском языке терминами — если они есть (для lift и raise) или взять на себя смелость ввести новый (для hoist). Здесь решение за тобой: ты взялся за интересную, но трудную работу — тексты таковы, что без терминотворчества просто не обойтись. Здесь нужно и владение языком, и практика перевода, и отличное понимание предметной области. Я бы на подобное не рискнул, поэтому воленс-ноленс выступаю в роли комедийного консультанта, способного максимум тыкнуть в нужном направлении:
Здесь вам, Ваше Высочество, никто ничего не скажет. Но в Арлингтонской тюрьме в камере смертников содержится человек... имени которого я не знаю. Вот он бы мог что-нибудь рассказать о Председателе...
Все, что здесь сказано, может и будет использоваться против меня.
Здравствуйте, Кодт, Вы писали: К>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>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Это всё понятно. Осталось описать правила, по которым функция обязана отображать декартово произведение множеств значений аргументов, расширенных при помощи null элемента, в аналогичным образом расширенное множество значений. Потому, что очевидно наличие бесконечного множества таких функций, всё еще совпадающих с накрытой на всей области её определения.
Ну, правила-то описаны. Есть законы, которым удовлетворяют функторы и монады.
Вопрос лишь в том, нужно ли пугать незамутнённого пользователя C# всеми теми вещами, которые составляют порог вхождения в Хаскелл.
Если бы я был царь, то я сказал бы следующее:
Пусть некий тип представляет множество допустимых значений (числовой тип — какой-то отрезок числовой оси; класс — объекты этого класса; и т.п.)
Этот тип расширяется специальным исключительным значением (NaN, null).
Тогда уже существующие операции над исходным типом/типами (одноместные, двуместные, сколько-угодно-местные) расширяются интуитивно понятным способом: если любой аргумент принимает исключительное значение, то и результат — тоже исключительное значение.
Будучи поддержанной в языке, эта логика позволяет избавиться от рутинной работы по проверке всех аргументов на допустимость.
В то же время, она не запрещает реализовывать любое другое поведение вручную, как встарь.
Для любителей точных наук — процедура расширения называется "поднятием пути" (lifting), а расширенная операция — "накрывающим отображением" (lifted function).
(Ну и дальше ссылки на Понтрягина, Yet Another Haskell Tutorial; иллюстрации поднятия из Id в Set, из Maybe в Set и прочее по вкусу).
Здесь вам, Ваше Высочество, никто ничего не скажет. Но в Арлингтонской тюрьме в камере смертников содержится человек... имени которого я не знаю. Вот он бы мог что-нибудь рассказать о Председателе...