Алексей
блин, точно я про дженерики то забыл
A64m
http://wouter.coekaerts.be/2018/java-type-system-broken
а баг с вариантностью массивов в яве есть? (ссылку не читал)
Alexander
я не знаю как их можно спутать
Если запихнуть в другую программу компилятор и код исходной программы - можно спутать.
Vladislav
по-другому подойду к вопросу все, что можно выполнить до деплоя, это статика
Алексей
ну вот в C# дженерики "настоящие" в отличии от Java, значит в этом языке должна действительно быть типобезопасность, я полагаю
Danila Matveev
а баг с вариантностью массивов в яве есть? (ссылку не читал)
это боль, которую джава решила тащить с собой всегда как напоминание об ошибках
Alexander
по-другому подойду к вопросу все, что можно выполнить до деплоя, это статика
Можно деплоить докер-контейнер, в котором при его запуске будет запускаться программа с встроенным компилятором и исходной программой.
Алексей
по-другому подойду к вопросу все, что можно выполнить до деплоя, это статика
с чего это вдруг? до деплоя можно выполнить огромную кучу вещей, которую язык никак не поворачивается назвать статикой
Vladislav
Нет, тогда это будет рантайм-ошибка у юзера, мол не удалось "скомпилировать"
Danila Matveev
ну вот в C# дженерики "настоящие" в отличии от Java, значит в этом языке должна действительно быть типобезопасность, я полагаю
вот по ссылке портянка примеров о том, что это не обязательно верно из коробки качество реализации важно
Vladislav
короче, не знаю как лучше терминологию подобрать, но меня лично волнует, что мне компьютер с кодом поможет до того, как я его юзеру отправлю или задеплою на сервер
Vladislav
системы типов с этим помогают. то, что не помогает, типами быть не может
Алексей
https://blogs.msdn.microsoft.com/ericlippert/2007/10/17/covariance-and-contravariance-in-c-part-two-array-covariance/
Next time we’ll discuss a kind of variance that we added to C# 2.0 which is not broken.
Alexander
короче, не знаю как лучше терминологию подобрать, но меня лично волнует, что мне компьютер с кодом поможет до того, как я его юзеру отправлю или задеплою на сервер
Я сделаю такую систему, где Python-программа будет выполняться на миллионе разных данных в тестовом окружении, чтобы помочь тебе до деплоя на сервер.
Vladislav
это называется тестирование
Alexander
Это подходит под определение
Алексей
потому что определение неправильное
Anonymous
Хм, чем же доказательство отличается от проверки?
Vladislav
Это подходит под определение
тестирование отличается от типов, потому что доказывает корректность поведения программы при заданных сценариях (пусть их и миллион), а не отсутствие некорректного поведения by construction
A64m
Next time we’ll discuss a kind of variance that we added to C# 2.0 which is not broken.
это не про то что массивы исправили а, наверное, про добавление вериантности для интерфейсов во вторую версию клр (но не в сишарп, правда - в него только в четвертую)
Зигохистоморфный
Как тут оживленно
A64m
ну так сделали язык с сабтайпингом - ясно что дураки, какие еще варианты-то?
Vladislav
Окей, принимается.
я использую тесты когда системы типов не хватает в языке без системы типов, как Python, естественно надо всё покрыть тестами, чтобы хоть чуть-чуть рассудка сохранить
Vladislav
поэтому они там на TDD помешаны
Антон
а баг с вариантностью массивов в яве есть? (ссылку не читал)
В яве встроенные массивы контрвариантные
Anonymous
ну так сделали язык с сабтайпингом - ясно что дураки, какие еще варианты-то?
В какой статье об этом можно почитать? Ну что авторы языков с сабтайпингом - подтип дураков?
Anonymous
В яве встроенные массивы контрвариантные
Ковариантны, но не суть - это всего лишь оптимизация, как я понимаю
A64m
обычно так прямо в статьях не пишут Ж((
Алексей
сабтайпинг - это что? наследование чтоли?
A64m
не обязательно
Антон
Наследование - это как бы субтипирование, только сломанное
🌞Sunny
Че пацаны
🌞Sunny
Мутабельность?
Алексей
а что в нём сломанного?
A64m
Наследование - это как бы субтипирование, только сломанное
один сломал два раза - другой потерял два раза.
Alexander
Кстати, почему фиолетовый и зеленый круги не пересекаются? Разве не существует людей со взвешенной позицией?
Cheese
что-то очень похожее на URI, и являющееся URI
это локальный контекстно-зависимый ури, а можно было сделать глобальный
A64m
Кстати, почему фиолетовый и зеленый круги не пересекаются? Разве не существует людей со взвешенной позицией?
если у человека взвешенная позиция - как он сторонником динамики может быть?
Alexander
если у человека взвешенная позиция - как он сторонником динамики может быть?
У людей вообще интересные сочетания бывают. Верующий ученый-физик, например
Cheese
если у человека взвешенная позиция - как он сторонником динамики может быть?
для некоторых задач, например, для интерфейса командной строки ОС, я не видел пока хороших типизированных яыков
A64m
так их не делает никто потому-что
IC
это локальный контекстно-зависимый ури, а можно было сделать глобальный
это RFC3986 URI. абсолютные идентификаторы в схеме https там тоже есть
Алексей
если у человека взвешенная позиция - как он сторонником динамики может быть?
ну может человек хочет в динамике менять объекты, почему бы и нет?
A64m
динамические языки это ж не какая-то альтернатива, а просто устаревшая в конце 70-х технология.
Alexander
Или он программирует на языке со смешанной типизацией?
Alexander
Или он программирует на статически типизированном языке как с а-ля void*?
Алексей
динамические языки это ж не какая-то альтернатива, а просто устаревшая в конце 70-х технология.
ну устаревшая или нет, но тем не менее используется и используется очень широко
Cheese
Alexander
да, только сейчас это модно писать в виде interface{}
Таким образом, пересечение оных кругов расширяется до пользователей ОО-языков?
Maxim
Всем привет, читаю write yourself a scheme, столкнулся с проблемой: решил запилить некое подобие динамической типизации из лиспа, условно говоря, (+ 1 2) == 3, а (+ 1 2.5) == 3.5. Для этого сделал функцию, в которую передаю операцию (например, (*)) и 2 аргумента в виде оберток над значениям. Хочу, чтоб это работало обобщенно, но в итоге получаю ошибку Couldn't match expected type ‘a’ with actual type ‘Integer’ ‘a’ is a rigid type variable bound by. Как можно это исправить? Вот код: applyOp :: Num a => (a -> a -> a) -> LispVal -> LispVal -> LispVal applyOp op (LispNumber a) (LispNumber b) = LispNumber (op a b) applyOp op (LispNumber a) (LispDouble b) = LispDouble (op (fromIntegral a :: Double) b) applyOp op (LispDouble a) (LispNumber b) = LispDouble (op a (fromIntegral b :: Double)) applyOp op (LispDouble a) (LispDouble b) = LispDouble (op a b) В LispNumber лежит Integer, в LispDouble - Double
A64m
кхм кхм в отличии от хаскеля кхм кхм
существует и такая проблема
Алексей
а это не проблема
IC
« the haskell is fine... »
Алексей
ну точнее для хаскелистов может быть и проблема, но вот для меня нет, потому что я знаю кучу разнообразных языков и могу писать почти на чём угодно
A64m
так что проблема
Алексей
но ведь все эти языки - говно
очень субъективное утверждение
🌞Sunny
ох уж эти фанатики хаскеля
Andrey
исправить просто - по символу + делай свертку листа интов ор даблов (лиспвал) и возвращай инт ор дабл
Алексей
кто-то и хаскель назовёт говном потому что у него порог входа неслабый такой
A64m
так и хаскель говно
Andrey
скорее потому что не идрис/агда
A64m
но там хоть какое-то движение в направлении не совсем говна есть
Maxim
когда применяешь applyOp, фиксируется a. оно может быть любым, но только одним во всей функции
понимаю, хочу узнать, как это лучше всего реализовать наиболее обобщенно
Cheese
когда применяешь applyOp, фиксируется a. оно может быть любым, но только одним во всей функции
но это можно попробовать обойти таким путём: applyOp :: (forall a. Num a => a -> a -> a) -> LispVal -> LispVal -> LispVal
Leonid 🦇
я вот не понимаю нытьё про порог входа в хаскель. Если я смог, значит не высокий.
Maxim
юзал NoMonomorphismRestriction
Cheese
пробовал
что не срослось?
Алексей
но там хоть какое-то движение в направлении не совсем говна есть
а оно нужно обычным программистам, которые какие-нибудь круды лепят с небольшим количеством бизнес логики?