Дробная мощность единиц измерения в 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), если она возникла в расчетах и, возможно, однажды поняла, что означает эта единица в буквальном смысле.