Ошибка вывода / проверки типа при использовании вычислений на уровне типов

Я столкнулся с проблемой при работе с функциональностью единиц измерения в метаскале , определенной в файле 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
    ]

Похоже, компилятор не может определить, что данный тип равен Количество [_1] при «вычитании измерения», например. грамм. переход от области к расстоянию, как в (1) :

Quantity[_2 - _1] <> Quantity[_1]

Непонятно то, что это работает при «добавлении измерения» e. грамм. переходя от длины к области, как в (2) :

Quantity[_1 + _1] <> Quantity[_2]

(Извините, что не вставил здесь весь код, это слишком много. Я попытался свести к минимуму свой пример, но мне это не удалось. Вот почему я Я просто ссылаюсь на него.)

6
задан soc 22 October 2011 в 12:07
поделиться