Nikolay
И половина, вероятно, майкрософтоненавистники
Roman
Ну если я скажу: "Иммутабельность слишком много полезных плюсов даёт, тут не объяснить, поэтому идём дальше" то меня закидают помидорами
У меня есть пример из текущего проекта, который и про иммутабельность и про АТД. На клиент отдается модель, в которой помимо самого пейлоада есть пачка полей CanRead; CanBlock; CanDelete; etc. Эти поля с пермишенами само собой мутабельные булевые проперти. Так вот, когда тебе пришла в коде такая модель, невозможно понять, эти поля в false потому что доступа нет, или потому что их еще не проставили как надо. В то же время, когда у тебя модель immutable таких сомнений нет. А если сюда еще приплести таплы - то можно вообще пейлоад и модель пермишенов сделать таплой, тогда вообще никаких сомнений не окажется
Nikolay
Если не проставили, должно быть null)
Roman
но поля не nullable
Nikolay
но поля не nullable
Ну решение твоей проблемы - nullable поля
Nikolay
Так мне скажут
Roman
это один из вариантов. Но если все строить на наллабл полях, то код из if (canRead)... превращается везде в if (canRead.HasValue && canRead.Value)
Roman
Вообще, какие бы ты аргументы ни привел, тебе всегда дадут контр пример, что мол с нашими технологиями это тоже решаемо. Давить стоит именно на удобство использования и на уменьшение кол-ва необходимого бойлерплейта
Bonart
Вообще, какие бы ты аргументы ни привел, тебе всегда дадут контр пример, что мол с нашими технологиями это тоже решаемо. Давить стоит именно на удобство использования и на уменьшение кол-ва необходимого бойлерплейта
public readonly struct Option<T> : IOption<T, Option<T>> { internal Option(Some<T> value) => _value = value; private readonly Some<T>? _value; public bool TryGet([AllowNull]out T value) { var result = _value.HasValue; value = result ? _value.Value.Unwrap : default; return result; } public Option<T> Some(T value) => new Option<T>(Option.Some(value)); public static explicit operator Option<T>(Option<T, Option<T>> option) => option.Inner; public Option<T, Option<T>> AsGeneric => this; public static explicit operator Option<T, Option<T>>(Option<T> option) => option; public override string ToString() => TryGet(out var v) ? $"Some{{{v}}}" : $"None<{nameof(T)}>"; }
Roman
Ага. Интересно, во что превратится код среднестатистического проекта с переходом на C# 8.0, где референс тайпы тоже будут делиться на наллабл и нет. Мне, почему-то кажется, что везде будут дописывать вопросик и все будет как раньше)
Bonart
Прелесть еще и в том, что без инициализации Option будет корректен
Roman
Ну вот как раз о бойлерплейте - можно сравнить кол-во кода для Option в C# vs F#
Bonart
Ну вот как раз о бойлерплейте - можно сравнить кол-во кода для Option в C# vs F#
У F# бонус за счет нормальной реализации GetHashCode и Equals по умолчанию, а также лучшего вывода типов
Bonart
Правда надо иметь в виду, что обычный Option в F# - класс
Roman
ну есть и UOption или как его там
Ayrat
Roman
Как в котлине с джавой?
я не знаю, как там
Bonart
Nikolay
я не знаю, как там
Всё, что из джавы - с вопросиком
Ayrat
тем более структ опшн ввели, а вот экосистема вся на обычном option живёт т.е. member x.Method(?args) даст опшн класс defaultArg требует опшн класс Seq.choose нет (и не будет?) перегрузки для валуеопшн
Bonart
Всё, что из джавы - с вопросиком
Нет, давно уже отказались
Nikolay
По крайней мере в андроиде так было
Анна
@Dolfik забей на аудиторию, делай доклад для себя и наслаждайся
Ayrat
короче, сейчас, на данном этапе F# (ещё с учётом что брейкинг ченжи это фуфуфу) ValueOption как собаке 5ое колесо
Nikolay
@Dolfik забей на аудиторию, делай доклад для себя и наслаждайся
Ты хочешь смыть свой позор моим позором?
Bonart
А как?
То, что из явы даст особый тип, который "оптимистично" не null
Nikolay
Кстати, Аня, не хочешь компилятор написать? :D
Bonart
И прощай null safe?
Почему? Если ты не оптимист - присваивай переменной с вопросиком.
Bonart
Это компромисс между null-safe языком и null-unsafe рантаймом и другими языками на нем
Nikolay
Путь к null-safe рантайму
Bonart
Путь к null-safe рантайму
...лежит через ломающие изменения. Для JVM нереально
Nikolay
...лежит через ломающие изменения. Для JVM нереально
Лежит через написание нового рантайма
Анна
Ты хочешь смыть свой позор моим позором?
ты утверждаешь, что я опозорилась? 😐
Анна
Кстати, Аня, не хочешь компилятор написать? :D
Давно мечтаю, но надо сначала уволиться с работы
Nikolay
Это всё из-за заметок
Bonart
Давно мечтаю, но надо сначала уволиться с работы
Начни с Форта - там можно без отрыва
Nikolay
Давно мечтаю, но надо сначала уволиться с работы
Напиши мини F#, работы на пару дней
Nikolay
few hours of work
Анна
Это всё из-за заметок
Я уже успокоилась и не троллюсь этим :)
Nikolay
Напиши мини F#, работы на пару дней
Чтобы компилировался в асм для микроконтроллеров
Ayrat
зачем делать что-то бесплатно если можно за деньги?
Анна
Ну это ты и сам можешь написать
за деньги меня не берут компилятор пилить
Nikolay
Ну это ты и сам можешь написать
Я не шарю в компиляторах
Vasily
На квотейшнах
Nikolay
А Ане вроде интересно
Nikolay
Кто-то же говорил, что у F# очень простой синтаксис
Анна
Я не шарю в компиляторах
самое время прошариться! Будешь тру фулстек разработчик - сам железо запилил, сам компилятор написал, сам фирмвару
Ayrat
Я наверное не уловил в чём суть претензий @Dolfik к @AnutaU
Nikolay
Просто шутка
Анна
Она ему симпатична
Давай вот тут без шуточек в стиле подруги моей мамы
Nikolay
Она ему симпатична
Это всё ради компилятора
Nikolay
Vladislav
Я наверное не уловил в чём суть претензий @Dolfik к @AnutaU
я вообще не понимаю о чем тут обсуждение)
Romɑn
я вообще не понимаю о чем тут обсуждение)
@fsharp_flood - познавательное, полезное общение ни о чем
x
короче, сейчас, на данном этапе F# (ещё с учётом что брейкинг ченжи это фуфуфу) ValueOption как собаке 5ое колесо
я кстати почему-то сразу думал что он и есть структура в f#, потому что себе на проекте c# сделал опшен структурой..
x
а оказалось нет
Ayrat
я ещё думал что тупли через ValueTuple компилятся, но тоже нет
Roman
я ещё думал что тупли через ValueTuple компилятся, но тоже нет
Struct tuples, компилируются, или по крайней мере совместимы
Roman
Меня это спасло
Romɑn
https://www.ozon.ru/context/detail/id/2314340/ так, врага нужно знать в лицо. Эта книга поможет внедрить фш в проекты по всему миру!
Romɑn