Pull to refresh

Comments 6

Выводы в статье делаются правильные, и тема связи семантики, типов и дуальности, сама по себе, очень интересная. Но не покидает ощущение, что примеры на Haskell немного не в тему. Всё-таки, рассматриваемые паттерны существенно опираются на побочные эффекты и изменение состояния. Синтаксис Haskell очень хорош, не спорю, он и создавался для подобных рассуждений, но с точки зрения семантики, он тут ни при чём. В рамках чистого функционального программирования, приводимые типы либо населены крайне скудно и тривиально, либо, как в случае с () -> t, и вовсе соответствуют Void. Возможно, лучше было бы ограничиться формальными математическими обозначениями или диаграммами.

Насчет семантики Хаскеля — бесспорно. Но хотелось просто удержать внимание читателя на сигнатурах, пренебрегая по ходу некоторыми вещами типа IO. Сначала думал держаться чисто математической нотации, но Хаскель по сути так и делает.

Спасибо за отзыв!
В общем идея поиска дуалов у существующих паттернов и функций мне понятна чисто с математической точки зрения, но как человеку, не знакомому ни с C# ни с Haskell, не до конца понятна суть записи
completed :: () -> ()
next :: t -> ()

Если смысловую нагрузку
MoveNext' :: Bool -> ()

Неуверенно трактую как «вызвать Bool чтобы что-то получить» (полагаю, формулировка в корне неверна), то () -> () выглядит либо как «вызвать функцию, где return — ещё одна функция», либо «вызвать что-то чтобы получить что-то».
С паттернами и GoF в определенной мере знаком, но суть записи, увы, до конца не понимаю.
MoveNext' :: Bool -> () это промежуточная версия. Чуть пониже был абзац о том, что как раз этот (промежуточный) результат дуальности и вызывает диссонанс, который я, видимо, не очень доступно объяснил.

Смысл в том, что бинарная неопределенность теряется, поэтому boolean не нужен: речь о «функции без параметров» (антиматематическое определение, но понятное программистам).

Если до сих пор не ясно — задайте вопрос поточнее, я постараюсь дать более развернутый ответ.
Спустя некоторое время после написания статьи довелось столкнуться с паттерном Iterator в Java Stream API, в общем смысловая нагрузка и различие MoveNext() и Current() стали более понятны.

Смысл в том, что бинарная неопределенность теряется, поэтому boolean не нужен: речь о «функции без параметров»


Если мы понимаем нашу прямую задачу линейного программирования как классическую задачу «распределения ресурсов», двойственную ей задачу можно интерпретировать как задачу «оценки ресурсов».

(с) Wikipedia, по запросу «Двойственность (оптимизация)»

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

Если брать чисто математически — обратную функцию, то из MoveNext(), возвращающей bool невозможно написать обратную функцию, так как, снова таки, цитируя Википедию (гораздо точнее выражает мои мысли, чем я сам):
Чтобы найти обратную функцию, нужно решить уравнение y=f(x) относительно x. Если оно имеет более чем один корень, то функции, обратной к f не существует.
Таким образом, функция обратима на интервале тогда и только тогда, когда на этом интервале она взаимно-однозначна.

Если
MoveNext :: () -> Bool

записать как
bool = x.moveNext(); (1)
(Запись ближе к математическому определению функци, отсюда понятно, что отношение x к у не будет взаимно однозначным).
Следовательно, математически обратной функции к (1) не существует, т.к. мы получим уже отношение, а не функцию (не выполнится условие единому x соответствует единый y)ю
Следовательно, если ситуацию с True отбросить, т.к. она ломает нашу обратную функцию с математической точки зрения безвозвратно, то ситуация с False всегда будет соответствовать пустому множеству.

Небольшой, наверное, снова неточный вывод: если отбросить вариант с True, функция принимающая на вход ничего (False, следующего элемента в списке нет) и возвращающая пустой список (пустое значение списка), определенно имеет место быть как математическая функция (0 -> 0, не знаю, насколько это точно).
Вопрос, какой это имеет смысл?
Если я конечно, теперь, благодаря вашему комментарию и помощи Википеди лучше понял смысл.
Вы не там ищете дуальность. Обратная функция — это очень частный случай дуальной функции. Дуальность, о которой пишу я, это именно дуальность на уровне стрелки (откуда она «выходит» и куда она «входит» — и не более того). Такая дуальность не предполагает никаких решений никаких уравнений; в том числе, биекция (она же «взаимо однозначная» связь) не является необходимым условием.
Математически говоря, сигнатуру t -> () можно задать только единственным образом: по определению, () не может быть пустым множеством; а вот «синглтоном» — т.е. множеством с одним-единственным элементом — может быть вполне. Из любого множества существует одна и только одна такая функция: попробуйте сами определить две разных и убедитесь, что вы получите одну и ту же.
Sign up to leave a comment.

Articles