Дробная мощность единиц измерения в F#

Верно ли сказать, что в F# нет дробных блоков питания?

5 ответов

Решение

В дополнение к тому, что уже было сказано, лучшим источником информации о (а не только) единицах измерения F# является кандидатская диссертация Эндрю Кеннеди, которая фактически разработала единицы измерения F#. Он упоминает дробные единицы:

Самое важное решение - разрешить или нет дробные показатели размеров. Аргумент против них является философским: величина с таким размером, как М1/2, не имеет физического смысла, и если такая вещь возникнет, это будет означать пересмотр набора базовых измерений, а не переоценку интегральных показателей. Аргумент в пользу прагматичен: иногда проще написать программный код, который временно создает значение, измерение которого имеет дробные показатели. В этой диссертации преобладает прежний взгляд, а дробные показатели не учитываются. Тем не менее, большая часть теории будет применяться точно так же; любые потенциальные различия выделяются по мере их возникновения.

Я думаю, что это, по сути, причина того, что F# не имеет дробных единиц, потому что дизайн F# очень близко следует за работой Эндрю Кеннеди, чтобы убедиться, что это правильно.

Обновление: в F# 4.0 реализована поддержка дробных показателей

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

Создавать новую базовую единицу каждый раз, когда сталкиваешься с показателем дробной мощности, - неправильный подход.

Эти единицы не являются единицами СИ, и их использование нарушает совместимость библиотеки. Если вы определяете sqrtHz как новый модуль, а я определяю rootHz, наш код не может работать вместе. В любом случае, мне нужно было бы ввести довольно большой набор базовых единиц, чтобы иметь полный набор Hz^-2, Hz^3, Hz^-5,... Просто предложить рациональные показатели, кажется, лучший выбор, кстати. Boost.units делает так.

Отсутствие буквально 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' можно рассматривать как вину или благословение, но это четкое указание на то, что проверки единичной меры существуют.

РЕДАКТИРОВАТЬ: После прочтения комментария ОП и исключения из статьи Эндрю Кеннеди, кажется, @nicolas является правильным - F# не поддерживает единицы измерения с дробными показателями.

Разве ответ не должен быть таким же простым, как сказать: да, герц измеряется в s^-2, что совпадает с s^(1/2)? Вот и ты. Кроме того, мне нравится философская идея использовать, скажем, m^(1/2), если она возникла в расчетах, и, возможно, однажды понять, что означает эта единица в буквальном смысле.

Другие вопросы по тегам