Есть ли языки, которые позволяют юниты? - PullRequest
23 голосов
/ 21 августа 2009

При написании следующего сегодня в C #

DateTime.Now.AddYears(-60)

Я задавался вопросом, существуют ли языки, которые допускают более естественный синтаксис с единицами измерения:

DateTime.Now - 60years

Кто-нибудь знает что-нибудь? В частности, меня интересует присутствие операторов единиц (?), Которые превращают «60 лет» в, например, "TimeSpan.FromYears (60)". Также было бы неплохо иметь возможность определять свои собственные операторы модулей, подобно тому, как вы можете писать операторы преобразования в C #

(Да, я знаю, что TimeSpan не обслуживает годами - это пример.)

Ответы [ 24 ]

22 голосов
/ 21 августа 2009

F # имеет единицы измерения. Несколько примеров из

http://blogs.msdn.com/andrewkennedy/archive/2008/08/20/units-of-measure-in-f-part-one-introducing-units.aspx

alt text

alt text

12 голосов
/ 21 августа 2009

Вас может заинтересовать F # Единицы измерения поддержка

10 голосов
/ 21 августа 2009

Ну и библиотека ActiveSupport для ruby ​​расширяет класс Integer такими методами, как часы и дни, что позволяет писать такие вещи, как:

Time.now + 5.days

Но на самом деле это не синтаксическая функция - это просто вызов метода и возможен на любом языке, который позволяет добавлять методы в существующий класс. Вы можете сделать это в C # с помощью методов расширения - хотя там должно быть 5.days().

7 голосов
/ 21 августа 2009

Существует библиотека Boost C ++ для модулей, в которой широко используется метапрограммирование шаблонов для обеспечения чего-то похожего на нужный вам синтаксис.

quantity<force>     F(2.0*newton);
quantity<length>    dx(2.0*meter);
quantity<energy>    E(work(F,dx));

http://www.boost.org/doc/libs/1_37_0/doc/html/boost_units.html

4 голосов
/ 21 августа 2009

Новый язык Sun Fortress поддерживает юниты и, если память служит, достаточно умен, чтобы помешать вам делать странные вещи, такие как вычитание мер времени из мер длины.

А у Mathematica есть единицы измерения и не слишком громоздкий синтаксис для их обработки.

3 голосов
/ 21 августа 2009

Unum делает в точности то же самое для Python, допуская такой код:

>>> TON + 500*KG

1.5 [t] 

>>> 5E-8*M - 28*ANGSTROM

472.0 [angstrom]

>>> 3*H + 20*MIN + 15*S

3.3375 [h]

>>> H == 60*MIN

True

>>> 10000*S > 3*H + 15*MIN

False

>>>
2 голосов
/ 21 августа 2009

Библиотека Java JODA работает таким образом.

И есть JSR-275 , который предлагает структуру единиц.

Впервые я услышал об этой проблеме в 1997 году от Мартина Фаулера. Об этом он написал в своих «Паттернах анализа» .

2 голосов
/ 21 августа 2009

Когда вы используете юниты, вы фактически назначаете тип. Преобразования могут быть реализованы посредством приведения или дифференцирования вызовов функций на основе типов параметров (перегрузка функций). Почти любой статически типизированный язык (который позволяет вам полностью определять типы) позволил бы вам сделать нечто подобное. Это сделало бы вашу программу более надежной, хотя те, кто предпочитает динамически типизированные языки, могут утверждать, что выигрыши невелики по сравнению со временем, затрачиваемым на реализацию такой тщательной системы типов для большинства приложений. С другой стороны, создание Mars Climate Orbiter заслуживает такой системы типов.

Синтаксис немного отличается, но ваш пример кажется мне очень похожим на распространенные примеры того, как некоторые используют систему типов Хаскелла (или систему любого типизированного функционального языка), хотя, как я уже говорил, это также выполнимо в C-подобном а также языки.

2 голосов
/ 21 августа 2009

См. Ответ по C # Extensions , где класс int расширен для поддержки таких методов, как Hours (), Days () и т. Д.

Powershell имеет операторы КБ, МБ и ГБ для обработки размеров файлов и т. Д.

Функция DATE_ADD () в MSSQL принимает такие единицы, как день, час и т. Д. Для арифметики даты.

2 голосов
/ 22 августа 2009

Ада и ее двоюродный брат, VHDL, непосредственно поддерживают концепцию единиц. Поскольку эти языки чрезвычайно строго типизированы, единицы измерения - это естественная способность строгости типов.

...