Бабушка, смотри, я сделал двач! Войти !bnw Сегодня Клубы
Внезапно осознал сравнительно простую вещь. В некоторых языках и библиотеках есть поддержка систем единиц. Есть библиотечные, можно свои определять. И почти во всех для того, чтобы получить 15 метров, надо вызвать какой-нибудь хитрожопый конструктор специального вида. Но почему просто не определить типы так, чтобы `15` можно было **умножить** на `метр`? Это было бы прикольно, интуитивно, физически корректно. И с точки зрения системы типов правильно ИМХО. Или я что-то пропустил, и где-то есть, кроме меня, разумные люди, которые так делают?
Рекомендовали: @ninesigns
#LD9CL8 / @dluciv / 12 дней назад

потому что умножение не меняет домена, а у тебя - меняет.
#LD9CL8/KX1 / @telegram / 12 дней назад

в гошке так делают. как минимум в стандартном пэкедже time.

#LD9CL8/K28 / @lexszero / 12 дней назад
@telegram С чего бы не меняло? Если я метры умножу на метры, то получатся что, метры? Как определю операцию умножения, так и будет работать.
#LD9CL8/7MR / @dluciv --> #LD9CL8/KX1 / 12 дней назад
@lexszero Разумные люди. Но правда тут скорее интересны языки, на которых имеет смысл физические вычисления делать.
#LD9CL8/HYX / @dluciv --> #LD9CL8/K28 / 12 дней назад
В Haskell можно.
#LD9CL8/P18 / @l29ah / 12 дней назад
а в чем вообще проблема? даже в плюсах можно.
#LD9CL8/C72 / @tempest / 12 дней назад
@tempest хотя не, заебешься выводить типы более сложные, чем "значение в метрах"
#LD9CL8/ETB / @tempest --> #LD9CL8/C72 / 12 дней назад
почитай что такое умножение и его свойства а потом съеби
#LD9CL8/CYJ / @voker57 / 12 дней назад
@voker57 Чё там?
#LD9CL8/ZL2 / @anonymous --> #LD9CL8/CYJ / 12 дней назад
15 * std::chrono::seconds(1) покатит?
#LD9CL8/Z0I / @glupovat / 11 дней назад
@voker57 Прочитай, что такое поле и кольцо, и не разевай рот. Какие хочу, такие определяю.
#LD9CL8/LO2 / @dluciv --> #LD9CL8/CYJ / 11 дней назад
@glupovat Не. `15 * std::chrono::second` покатило бы.
#LD9CL8/IFF / @dluciv --> #LD9CL8/Z0I / 11 дней назад
@telegram М.б. ты со сложением перепутал? Сложение — да. Складывать огурцы и ящики нельзя. И вычитать тоже. А умножать киловатты на часы можно. И делить водку на людей тоже.
#LD9CL8/TMB / @dluciv --> #LD9CL8/KX1 / 11 дней назад
@l29ah http://hackage.haskell.org/package/units ? Ну кстати близко.
#LD9CL8/NVA / @dluciv --> #LD9CL8/P18 / 11 дней назад
@tempest На самом деле в динамических языках легче бы было. В Питоне каком-нибудь.
#LD9CL8/42X / @dluciv --> #LD9CL8/ETB / 11 дней назад
@voker57 Точнее что такое пополнение поля и пополнение кольца. Вдруг сам не найдёшь.
#LD9CL8/3VV / @dluciv --> #LD9CL8/CYJ / 11 дней назад
@dluciv ну и чему будет равно 1 - километр в твоем кольце? про пополнение не нашел, скинь пруфлинк. Алсо, это все не нужно, потому что для любой величины существует только одна единица измерения, остальное может быть нужно только для ввода/вывода. И чем 1 * kilometer лучше kilometers(1)?
#LD9CL8/JY5 / @voker57 --> #LD9CL8/LO2 / 11 дней назад
Есть, в маткаде. Почему бы просто не определить пользовательские суффиксные литералы.
#LD9CL8/GJH / @mugiseyebrows / 11 дней назад
Если "килограмм" в твоей системе суть константа, приводящая к некой базовой системе единиц, то это дурная идея, потому что точность IEEE float'ов пойдёт по пизде моментально. Но в языках символьных вычислений так делают (в Maple units примерно так и работают, емнип), ибо там все эти константы можно просто сократить.
#LD9CL8/0GL / @h9lwka / 11 дней назад
@h9lwka Это аннотация для тайпчекера, не более того.
#LD9CL8/6XB / @l29ah --> #LD9CL8/0GL / 11 дней назад

Для этого зависимые типы нужны, физикам на такое обычно поебать.

#LD9CL8/K4H / @ninesigns / 11 дней назад
@ninesigns Нихуя, фантомных хватит.
#LD9CL8/W6J / @h9lwka --> #LD9CL8/K4H / 11 дней назад

@h9lwka хватит разве что чтобы не сложить метры и попугаи

#LD9CL8/QS9 / @ninesigns --> #LD9CL8/W6J / 11 дней назад
@ninesigns Ок ты прав, для умножения пожалуй нужны
#LD9CL8/T2M / @h9lwka --> #LD9CL8/QS9 / 11 дней назад
У меня все работает 15 * Quantity["Meters"]
#LD9CL8/UHV / @kuro / 11 дней назад

@kuro mathematica?

#LD9CL8/6PI / @ninesigns --> #LD9CL8/UHV / 11 дней назад
@ninesigns Ага
#LD9CL8/NGU / @kuro --> #LD9CL8/6PI / 11 дней назад
@voker57 Пруфы искать лень. Грубо говоря, ты можешь в рациональное поле добавить какое-нибудь иррациональное число, корень из 2 тот же (это пополнение), и дальше туда добавятся результаты всех операций с этим числом (это замыкание). Ты можешь добавить в вещественные числа i (пополнение) и после этого у тебя сделается комплексное поле (замыкание относительно существующих операций — если на входе вещественные или i, то всё, что на выходе — комплексные). При замыкании надо бывает что-то доопределить, например, что i*i = -1. С единицами ты тоже можешь добавить килограмм, метр и джоуль в вещественное поле, и тут даже легче будет: они с числми не будут смешиваться, будут жить похоже на отдельную компоненту вектора.
#LD9CL8/MVZ / @dluciv --> #LD9CL8/JY5 / 11 дней назад
@dluciv Ну введи константу, равную 1 с, и назови её SECOND. Или тебе обязательно нужно, чтобы секунда была объектом первого класса?
#LD9CL8/ZA1 / @glupovat --> #LD9CL8/IFF / 11 дней назад
@dluciv Ты, наверно, хотел сослаться на то, как в векторных пространствах умножают вектор на скаляр.
#LD9CL8/JR2 / @glupovat --> #LD9CL8/LO2 / 11 дней назад
@glupovat А примерно что одно, что другое подходит
#LD9CL8/FKT / @dluciv --> #LD9CL8/JR2 / 11 дней назад
@ninesigns Чтобы умножить значение типа «метры» на себя и получить значение типа «метры в квадрате» тоже хватит.
#LD9CL8/XOV / @anonymous --> #LD9CL8/QS9 / 11 дней назад
@voker57 > Алсо, это все не нужно, потому что для любой величины существует только одна единица измерения Чтобы компилятор не дал перепутать «метр в секунду» и «метр на секунду».
#LD9CL8/8YZ / @anonymous --> #LD9CL8/JY5 / 11 дней назад
ipv6 ready BnW для ведрофона BnW на Реформале Викивач Котятки

Цоперайт © 2010-2016 @stiletto.