Единицы измерения F # не упрощают - PullRequest
1 голос
/ 02 июля 2019

Предположим, что такие меры определены:

[<Measure>] type kilogram
[<Measure>] type kg = kilogram

[<Measure>] type s

Когда я определяю привязку следующим образом:

let x = 1.<kg / kilogram> // Type of x: float

F # правильно упрощает тип x с float<kg/kilogram> до float. Но когда я добавляю другой блок, как это:

let y = 1.<kg s / kilogram> // Type of y: float<kg s / kilogram>

Вместо упрощения типа y к float<s>, он показывает float<kg s / kilogram>

Почему F # не упрощает это в этом случае? Я что-то не так делаю?

1 Ответ

2 голосов
/ 02 июля 2019

Насколько я вижу, основываясь на нескольких экспериментах, единственное место, где компилятор использует тот факт, что kg = kilogram в процессе упрощения, - это когда конечный тип не содержит единиц, то есть тип float<1>.Во всех других случаях, которые я пробовал, он сохраняет и kg, и kilogram в типе блока.

Я подозреваю, что компилятор все еще знает, что тип 1.<kg/kilogram> равен kg/kilogram, но потому что этоэквивалентный 1, он не отображает его - он показывает float, а не float<1> или float<kg/kilogram>.

Нет необходимости замечать, что упрощение происходит, когда оно действительно необходимо - если вы попытаетесьсравнивая значение 1.<kg s / kilogram> со значением 1.<s / 1>, это хорошо напечатано:

let y = 1.<kg s / kilogram>
y = 1.<s/1>

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

...