Алексей
блин, точно я про дженерики то забыл
IC
Vladislav
по-другому подойду к вопросу
все, что можно выполнить до деплоя, это статика
Алексей
ну вот в C# дженерики "настоящие" в отличии от Java, значит в этом языке должна действительно быть типобезопасность, я полагаю
Vladislav
Нет, тогда это будет рантайм-ошибка у юзера, мол не удалось "скомпилировать"
Danila Matveev
A64m
Vladislav
короче, не знаю как лучше терминологию подобрать, но меня лично волнует, что мне компьютер с кодом поможет до того, как я его юзеру отправлю или задеплою на сервер
Vladislav
системы типов с этим помогают. то, что не помогает, типами быть не может
Алексей
Alexander
Vladislav
это называется тестирование
Alexander
Это подходит под определение
Алексей
потому что определение неправильное
Anonymous
Хм, чем же доказательство отличается от проверки?
Vladislav
Это подходит под определение
тестирование отличается от типов, потому что доказывает корректность поведения программы при заданных сценариях (пусть их и миллион), а не отсутствие некорректного поведения by construction
Alexander
Алексей
Зигохистоморфный
Как тут оживленно
A64m
ну так сделали язык с сабтайпингом - ясно что дураки, какие еще варианты-то?
Vladislav
Окей, принимается.
я использую тесты когда системы типов не хватает
в языке без системы типов, как Python, естественно надо всё покрыть тестами, чтобы хоть чуть-чуть рассудка сохранить
Vladislav
поэтому они там на TDD помешаны
Антон
A64m
обычно так прямо в статьях не пишут Ж((
Алексей
сабтайпинг - это что? наследование чтоли?
A64m
не обязательно
Антон
Антон
Наследование - это как бы субтипирование, только сломанное
🌞Sunny
Че пацаны
🌞Sunny
Мутабельность?
Алексей
а что в нём сломанного?
A64m
Alexander
Кстати, почему фиолетовый и зеленый круги не пересекаются? Разве не существует людей со взвешенной позицией?
A64m
Vladislav
A64m
так их не делает никто потому-что
Алексей
A64m
динамические языки это ж не какая-то альтернатива, а просто устаревшая в конце 70-х технология.
Alexander
Или он программирует на языке со смешанной типизацией?
IC
Alexander
Или он программирует на статически типизированном языке как с а-ля void*?
Алексей
Cheese
A64m
Алексей
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
A64m
так что проблема
🌞Sunny
ох уж эти фанатики хаскеля
Andrey
исправить просто - по символу + делай свертку листа интов ор даблов (лиспвал) и возвращай инт ор дабл
Алексей
кто-то и хаскель назовёт говном потому что у него порог входа неслабый такой
A64m
так и хаскель говно
Andrey
скорее потому что не идрис/агда
Cheese
Всем привет, читаю 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
когда применяешь applyOp, фиксируется a. оно может быть любым, но только одним во всей функции
A64m
но там хоть какое-то движение в направлении не совсем говна есть
Maxim
Maxim
Leonid 🦇
я вот не понимаю нытьё про порог входа в хаскель. Если я смог, значит не высокий.
Maxim
юзал NoMonomorphismRestriction