Можно ли реализовать инфраструктуру F # для единиц измерения в Scala? - PullRequest
8 голосов
/ 20 сентября 2011

F # поставляется со специальной поддержкой системы единиц измерения, которая обеспечивает безопасность статического типа при компиляции до числовых типов вместо того, чтобы обременять среду выполнения операциями обертывания / разворачивания.

Можно ли использовать магию системы типов Scala для реализации чего-то сравнимого с этим?

Ответы [ 4 ]

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

Ответ нет .

Теперь кто-то обязан указать мне на Скаляр , но это дает проверку во время выполнения . Может быть, тогда, указывают на усилия типобезопасных юнитов Джеспера Норденберга или Джима МакБита *, берущие его , но это громоздко и неловко.

Вместо этого я укажу на компилятор Units . Это дало Scala, еще в 2008/2009, довольно хорошую систему единиц, как можно увидеть в этом посте . Однако он сделал это, расширив компилятор, что не потребовалось бы, если бы системы типов было достаточно. Увы, он не поддерживается и больше не работает.

4 голосов
/ 21 сентября 2011

Я ничего не знаю об этом, но я только что наткнулся на это выступление в Scala Days: https://wiki.scala -lang.org / display / SW / ScalaDays + 2011 + Ресурсы # ScalaDays2011Resources-ScalaUImplementingaScalalibraryforUnitsofMeasure

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

Вид.Вы можете легко кодировать единицы СИ, используя целочисленное представление типов в кортеже показателей.См. http://svn.assembla.com/svn/metascala/src/metascala/Units.scala для примера реализации.

Также должна быть возможность поддержки расширяемой системы единиц, если единицы кодируются как TList пар типа единицы и целого числа (дляНапример, ((M, _1), (S, _2)), где M <: Unit и S <: Unit).Вычисление типов для количественных операций становится немного более сложным в этой кодировке.

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

1 голос
/ 18 октября 2013

Взгляните на Единицы измерения - Макросистема Scala . Кажется, чтобы удовлетворить ваши требования.

...