Size: a a a

Scala User Group

2020 April 28

λ

λoλegΥch in Scala User Group
это да
источник

λ

λoλegΥch in Scala User Group
скалак даже хуже себя ведет, говорит тайп мисматч на первом попавшемся параметре рандомного оверлоада
источник

λ

λoλegΥch in Scala User Group
дотти норм
источник

ΛВ

Λнтон Войцишевский in Scala User Group
Dmitry Zuev
Supertagged
Это всего лишь ньютайпы
источник

M

Mikhail in Scala User Group
Apache DOG™
У тебя есть 2 перегрузки эпплай с разными параметрами, ты Чото сломал в вызове функции из 7 параметров, ты хочешь понять что, а идея тебе краснит и пишет, эт чо за перегрузка.
если у тебя две перегрузки по 7 аргументов - то ты естественно делаешь что-то не так. Но в школе тебя наверняка должны были учить - "исключение подтверждает правило"
источник

M

Mikhail in Scala User Group
Λнтон Войцишевский
Это всего лишь ньютайпы
что не мешает делать рефайнды на них
источник

ΛВ

Λнтон Войцишевский in Scala User Group
Mikhail
что не мешает делать рефайнды на них
То есть они дают возможность в типе описать ограничения?
источник

ЮБ

Юрий Бадальянц in Scala User Group
Λнтон Войцишевский
То есть они дают возможность в типе описать ограничения?
А зачем тебе в типе ограничения?
источник

M

Mikhail in Scala User Group
Mikhail
если писать на скале как на энтерпрайз джаве 1.5, то удовольствия это явно не доставит. братиш, выкинь весь этот говнокод и пиши просто и по человечески. компайл тайм рефайнд предикаты - почти не применимы в жизни.
object CumulativeCoefficient extends TaggedType0[BigDecimal]{
 val max:Type = TaggedOps(this)(BigDecimal(2))
 
 //... или любая другая логика вместо Either
 def apply(value:Long):Either[String,Type] = ...validate > 0 and <= max..
}
type CumulativeCoefficient = CumulativeCoefficient.Type
@funfunfine как видишь - у тебя нет возможности затегать значение без проверки встроенных предикатов - это и есть суть рефайндов(и во многом валидейтед)
источник

M

Mikhail in Scala User Group
Юрий Бадальянц
А зачем тебе в типе ограничения?
Ex: Width, Age, Amount
источник

ΛВ

Λнтон Войцишевский in Scala User Group
Mikhail
@funfunfine как видишь - у тебя нет возможности затегать значение без проверки встроенных предикатов - это и есть суть рефайндов(и во многом валидейтед)
А почему это плохо?
источник

ЮБ

Юрий Бадальянц in Scala User Group
Mikhail
Ex: Width, Age, Amount
Я понимаю бизнес потребность, но я не понимаю, зачем это выносить в тип
источник

M

Mikhail in Scala User Group
Λнтон Войцишевский
А почему это плохо?
что плохо? я показал, что на тегах-ньютайпах можно построить рефайнды и сам тип гарантирует наличие валидных данных внутри - читай "описывает ограничения" (мы говорим Ширина - и точно знаем, что она не отрицательная)
источник

M

Mikhail in Scala User Group
Юрий Бадальянц
Я понимаю бизнес потребность, но я не понимаю, зачем это выносить в тип
Но ведь ты написал Amount - ты уже закодировал ментально ограничения, вынес в тип. А раз вынес - значит появилась необходимость по максимуму исключить возможность выстрела в ногу, который нарушит твое кодирование и внутреннюю гармонию)
источник

ЮБ

Юрий Бадальянц in Scala User Group
Я не совсем об этом. Я о том, что нет смысла выносить это в тип. Достаточно сделать свой Amount, который невозможно сконструировать с невалидным значением. То есть достаточно рантайм конструктора, который возрвщает Option или Either. То, как сделано в Refined, где проверяются литералы, на мой взгляд довольно бесполезно. Вот мы сейчас его используем вперемешку с supertagged и всё больше переносим с refined на tagged типы, потому что проверка литералов не нужна, нужны только безопасные конструкторы.
источник

ΛВ

Λнтон Войцишевский in Scala User Group
Mikhail
что плохо? я показал, что на тегах-ньютайпах можно построить рефайнды и сам тип гарантирует наличие валидных данных внутри - читай "описывает ограничения" (мы говорим Ширина - и точно знаем, что она не отрицательная)
А, не так тебя понял.

Касательно этого: выходит, что тут надо много бойлерплейта писать по сравнению с рефайндом вроде
источник

ΛВ

Λнтон Войцишевский in Scala User Group
Юрий Бадальянц
Я не совсем об этом. Я о том, что нет смысла выносить это в тип. Достаточно сделать свой Amount, который невозможно сконструировать с невалидным значением. То есть достаточно рантайм конструктора, который возрвщает Option или Either. То, как сделано в Refined, где проверяются литералы, на мой взгляд довольно бесполезно. Вот мы сейчас его используем вперемешку с supertagged и всё больше переносим с refined на tagged типы, потому что проверка литералов не нужна, нужны только безопасные конструкторы.
Рефайнед не только проверяет литералы. Он предоставляет во-первых функцию refineV, а во-вторых синтаксис специальный, который даёт вещи типа RefinedType.from(underlying):Either[...]
источник

ЮБ

Юрий Бадальянц in Scala User Group
Λнтон Войцишевский
А, не так тебя понял.

Касательно этого: выходит, что тут надо много бойлерплейта писать по сравнению с рефайндом вроде
У рефайнда есть ряд минусов относительно tagged типов:
1. Он построен на AnyVal и наследует все его проблемы.
2. Ошибки отвратительные.
3. Апи довольно уродское. Но это моё имхо.
4. Ты ограничен функциональностью библиотеки.
источник

ЮБ

Юрий Бадальянц in Scala User Group
Я короче довольно сильно разочаровался в этой либе в последнее время.
источник

ΛВ

Λнтон Войцишевский in Scala User Group
Юрий Бадальянц
У рефайнда есть ряд минусов относительно tagged типов:
1. Он построен на AnyVal и наследует все его проблемы.
2. Ошибки отвратительные.
3. Апи довольно уродское. Но это моё имхо.
4. Ты ограничен функциональностью библиотеки.
А в 4 в чем именно ограничения?
источник