Верно ли говорить, что: в F # не существует дробных единиц мощности
Дробная мощность единиц измерения в F #
Ответ 1
В дополнение к тому, что уже было сказано, лучший ресурс для информации о (а не только) единицах измерения F # Andrew Kennedy PhD тезис, которые фактически разработали единицы F #. Он упоминает дробные единицы:
Самое важное решение - разрешить или не допускать дробные показатели размеров. Аргумент против них философский: количество с размер, такой как M 1/2 не имеет никакого смысла физически, и если такая вещь возникла, предложит пересмотр набора базовых измерений, а не переоценку интегральные показатели. Аргумент в пользу прагматичен: иногда это проще для написания программного кода, который временно создает значение, размерность которого дробные показатели. В этой диссертации преобладает прежнее мнение, а дробное экспоненты не рассматриваются. Однако большая часть теории применила бы только одна и та же; любые потенциальные различия выделяются по мере их возникновения.
Я думаю, что это по сути является причиной того, что F # не имеет дробных единиц, потому что дизайн F # довольно внимательно следит за работой Эндрю Кеннеди, чтобы убедиться, что это звук.
Обновление: С F # 4.0 поддержка дробных показателей была реализована
Ответ 2
Единицы с дробными показателями довольно распространены, и в них нет ничего особенного. Вероятно, все в технологии столкнулись с плотностью шума напряжения, которая измеряется на квадрат (Гц). Это физически значимо, мощность шума пропорциональна ширине полосы, а шумовое напряжение - квадрат мощности, здесь нет странной математики.
Чтобы создать новый базовый блок каждый раз, когда вы сталкиваетесь с показателем дробной мощности, это не правильный подход.
Эти единицы не являются единицами СИ, и их использование ломает библиотечную совместимость. Если вы определяете sqrtHz как новый модуль, и я определяю rootHz, наш код не может работать вместе. Во всяком случае, мне нужно будет ввести довольно большой набор базовых блоков, чтобы иметь полный набор Гц ^ -2, Гц ^ 3, Гц ^ -5,... Просто предложить рациональные показатели, кажется, лучший выбор, кстати. Boost.units делает это.
Ответ 3
Отсутствие буквально fractional power
единиц измерения ни в коем случае не дает скидки на единицу F #, поскольку позволяет отображать, по-видимому, отношения fractional exponent
по-другому, имея наименьшую фракцию в качестве базового измерения:
let takeSqrt (x: float<_>) = sqrt(x)
выводит сигнатуру float<'u ^ 2> -> float<'u>
таким образом, избегая введения мнимого "естественно дробного" float<'u> -> float<'u^1/2>
.
let moreComplicated (x: float<_>) (y: float<_>) =
sqrt(x*x + y*y*y)
имеет выведенную подпись float<'u ^ 3> -> float<'u ^ 2> -> float<'u ^ 3>
, где все преобразования единиц измерения остаются действительными относительно некоторого производного неявного базового размера float<'u>
.
Тот факт, что фрагмент кода ниже
[<Measure>]type m
let c = sqrt(1.0<m>)
даже не компилируется с диагностикой The unit of measure 'm' does not match the unit of measure ''u ^ 2'
можно рассматривать как вину или благословение, но является четким указанием на то, что проверка единиц измерения на месте.
Ответ 4
РЕДАКТИРОВАТЬ: после чтения комментария к OP и за исключением статьи Андрея Кеннеди, появляется @nicolas правильно - F # не поддерживает единицы измерения с дробными показателями.
Ответ 5
Не следует ли отвечать так же легко, как сказать: да, герц измеряется в s ^ -2, что совпадает с s ^ (1/2)? Вот иди. Кроме того, мне нравится философская идея использования, скажем, m ^ (1/2), если она возникла в расчетах и, возможно, однажды поняла, что означает эта единица в буквальном смысле.