Я столкнулся с проблемой при работе с функциональностью единиц измерения в metascala, определенной в файл Units.scala.
В оставшейся части этого вопроса я буду использовать упрощенную схему только с одним типом единицы — длиной.
Итак, где на самом деле выглядит тип
Quantity[_1, _0, _0, _0, _0, _0, _0]
^ ^ ^ ^ ^ ^ ^
| | | | | | |
| Mass | Crncy.| Mol |
Length Time Temp. Lum.Intensity
этого будет достаточно для демонстрации проблемы:
Quantity[_1]
^
|
Length
Как только нужно определить тип, начинаются проблемы.
Рассмотрим этот пример (также взгляните на код из UnitsTest.scala а>):
val length: Quantity[_1] = m(5)
val area: Quantity[_2] = length * length // (1) Works
val dist: Quantity[_1] = area / length // (2) Doesn't work!
Я получаю сообщение об ошибке в последней строке:
type mismatch;
found :
scalax.units.Units.Quantity[
scalax.units.Subtractables.-[
scalax.units.Integers._2,
scalax.units.Integers._1
]
]
required:
scalax.units.Units.Quantity[
scalax.units.Integers._1
]
Похоже, что компилятор не может понять, что имеющийся тип равен Quantity[_1]
при «вычитании измерения», например. грамм. переход от области к расстоянию, как в (1)
:
Quantity[_2 - _1] <<not equal to>> Quantity[_1]
Сбивает с толку то, что это работает при «добавлении измерения», например. грамм. переходя от длины к площади, как в (2)
:
Quantity[_1 + _1] <<equal to>> Quantity[_2]
(Извините, что не вставил сюда весь код, это слишком много. Я попытался свернуть свой пример, но у меня не получилось. Вот почему я просто ссылаюсь на него.)