Каковы стратегии для поддержки / интеграции единиц измерения на языках? - PullRequest
8 голосов
/ 20 сентября 2011

Интересно, с чисто языковой точки зрения, для каких «особенностей» (семантически и синтаксически) потребуется «реализация» единиц СИ.

Какая "функциональность" обычно ожидается, если кто-то утверждает, что язык имеет большую поддержку единиц измерения?

  • Просто что-то вроде специальных литералов или синтаксического сахара?
  • Специальные соглашения, которые делают единицы безопасными (но без дорогостоящей упаковки во время выполнения)?
  • Специальный математический режим для вычислений с дробями?
  • Автоматические преобразования и принуждение между единицами?

Например, F # имеет встроенную поддержку единиц измерения в языке. Как это улучшить по сравнению с е. г. библиотека для Java?

Какие функции должны быть встроены в языки для улучшения удобства использования единиц? Какие функции не обязательно связаны с единицами измерения, но делают реализацию более привлекательной?

Ответы [ 5 ]

3 голосов
/ 20 сентября 2011

Преимущество F # над библиотекой Java UOM - безопасность простого типа. Вы получите ошибки во время компиляции, если попытаетесь добавить 3.<s> и 4.<m / s>.

В F # UOM стираются после проверки типов, потому что это единственный язык .NET с такой функцией.

В ответ на комментарий, вот простой тип дроби и его использование:

type Fraction<[<Measure>] 'a>(a : int, b : int) =
    member __.Divisor = a
    member __.Dividend = b
    member __.AsFloat = float a / float b
    static member (*) (a : Fraction<'a>, b : Fraction<'b>) : Fraction<'a * 'b> =
        Fraction(a.Divisor * b.Divisor, a.Dividend * b.Dividend)

type [<Measure>] m
type [<Measure>] kg
type [<Measure>] s

let a = Fraction<m / s>(4, 3)
let b = Fraction<kg>(2, 5)
let ``a times b`` = a * b

И возвращаемое значение имеет тип Fraction<kg m/s>, а его значение AsFloat равно 0.5333333333.

1 голос
/ 09 октября 2011

В 1980-х годах в Уведомлениях ACM SIGPLAN была хорошая статья.Идея заключалась в безопасности типов плюс анализ единиц, который вы изучаете в физике в старших классах: например, скорость равна миль / час, время - часы, поэтому умножение их вместе дает расстояние в милях, а система типов обеспечивает это дляВы, поэтому вы не можете делать ошибки категории.У языка или метаязыка были бы способы определить все это.В качестве другого примера, я недавно сделал некоторую валютную работу в Java, где CurrencyValue, разделенное на CurrencyValue, дало BigDecimal, то есть обменный курс;CurrencyValue, умноженное или разделенное на BigDecimal, дало другое CurrencyValue и т. д.

Так вы обычно делали старые экзамены по физике с множественным выбором PSSC: забудьте физику, просто запомните несколько констант вселенной,затем просто расскажите о проблеме, учитывая единицы заданных величин и требуемые единицы ответа, затем вы можете сами построить требуемую формулу.

1 голос
/ 20 сентября 2011

Захватывающий.Я погуглил это звяканье: «Я уверен, что мог бы сделать это довольно легко в Smalltalk» и наткнулся на Frink http://futureboy.us/frinkdocs/, который нацелен на JVM и Android.

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

и, конечно, ключом к этому является преобразование

Преобразование единиц между тысячами типов единиц с помощью огромного встроенного файла данных.

и неопределенность

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

IЯ уверен, что вы могли бы сделать это с классами в Java и определенно с Ada, но это будет много (извините) печатать.

1 голос
/ 20 сентября 2011

С точки зрения языкового дизайна достаточно иметь возможность:

  1. помечает типы данных произвольными метками (не только строковые или другие примитивные метки, но произвольно структурированные метки)
  2. выполнять произвольные вычисления во время компиляции над метками
  3. с учетом меток операндов и оператора (функции), вычислить метку результата функции, примененной к помеченным операндам

Все это можно сделать и было сделано более 10 лет назад с метапрограммированием шаблона C ++.

Существует также реализация для Haskell, которая использует (ограниченную) способность Haskell для выполнения вычислений во время компиляции над экземплярами классов типов. Это не так полно (AFAIK без дробных степеней и без единиц СИ).

0 голосов
/ 21 ноября 2016

Преемник библиотеки для Java (unitofmeasurement.org) теперь можно найти в unitsofmeasurement.github.io .Здесь находится стандарт Java для единиц измерения, JSR 363 .Проверьте это.

...