Одна из мотиваций автора — это получение качественной обратной связи. Аудитория на Habr-е и на GT — разная. Если статья глубокого уровня публикуется на GT, то автор не получает той обратной связи, на которую расчитывает и которую мог бы получить при публикации на Habr-е.
Семантика исходная с небольшим изменением: было T1 -> T2, стало T1 | null -> T2 | null.
Зачем coalescing, если достаточно расширить результирующий тип до: TResult | null?
Статистика из опредения паттерна Null Object. Null object при вызовах над ним — или возвращает Null Object, или выполняет ничего.
Если обычным кодом назвать код с '?.', то будет выполняться требование «работаю с объектом как обычно и получаю разумные значения».
Значение null совместно с operator-ом '?.' дает поведение: возврат null или выполнение ничего. В 99% задач достаточно такого поведения для паттерна Null Object.
Минусы исключений:
— хуже производительность
— отсутствует проверка уровня компиляции, что исключения формируются определенного вида и что они все преобразуются в адекватное сообщение для пользователя
— отсутствует нативная конструкция для выполнения независимых проверок с собиранием ошибок в одну агрегированную
Плюсы исключений:
— нативный синтаксис
— согласованность с другими конструкциями языка
— нативная поддержка компилятором
— нативная поддержка framework-ом и сторонними библиотеками
Исключение — это та же монада, но в профиль. Со следующей семантикой: (Func f, IEnumerable<Union<Result, Exception>> args) -> Union<Result, Exception>. var exception = args.FirstOrDefault(arg => arg.IsException)?.Exception; if (exception != null) return exception; return f(args.Select(arg => arg.Result));
Null reference затруднительно отлаживать в mutable-окружении. В таком окружении бывает затруднительно установить место появления null-а. В immutable-коде такой проблемы нет из-за прозрачности потоков данных.
У современного человека проблема другая — калорий потребляется больше, чем расходуется. Соответственно, для человека рекомендация обратная — двигаться рывками!
Бесконечно генерируемый список используется в переборных алгоритмах: bruteforce пароля, выбор лучшего хода в игре, поиск лекарства от рака и т.д. При генерации используется расширяющийся список комбинаций. На первом этапе — все комбинации из одного элемента, на втором — комбинации из двух элементов и т.д.
Концепция «бесконечные интервалов» удобна для отделения генераторов от самого алгоритма перебора (цикла). Концепция «бесконечных интервалов» удобна при комбинировании генераторов.
Чему равно a при срабатывании cond? И к каким проблемам в runtime-е это приведет?
Зачем coalescing, если достаточно расширить результирующий тип до: TResult | null?
Если обычным кодом назвать код с '?.', то будет выполняться требование «работаю с объектом как обычно и получаю разумные значения».
Минусы исключений:
— хуже производительность
— отсутствует проверка уровня компиляции, что исключения формируются определенного вида и что они все преобразуются в адекватное сообщение для пользователя
— отсутствует нативная конструкция для выполнения независимых проверок с собиранием ошибок в одну агрегированную
Плюсы исключений:
— нативный синтаксис
— согласованность с другими конструкциями языка
— нативная поддержка компилятором
— нативная поддержка framework-ом и сторонними библиотеками
Концепция «бесконечные интервалов» удобна для отделения генераторов от самого алгоритма перебора (цикла). Концепция «бесконечных интервалов» удобна при комбинировании генераторов.
Достаточно int64. При считывание символа на такт — его хватит на время больше существования вселенной.
ru.wikipedia.org/wiki/%D0%9D%D0%B8%D0%B3%D0%B5%D1%80%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D0%B5_%D0%BF%D0%B8%D1%81%D1%8C%D0%BC%D0%B0
lurkmore.co/419
helm.at.ua/blog/belka_iz_nigerii/2012-01-10-11