Question

Is it true to say that : there are no fractional power units in F#

Was it helpful?

Solution

In addition to what has already been said, the best resource for information about (not just) F# units of measure is Andrew Kennedy's PhD thesis, who actually designed F# units. He mentions fractional units:

The most important decision is whether or not to allow fractional exponents of dimensions. The argument against them is philosophical: a quantity with a dimension such as M1/2 makes no sense physically, and if such a thing arose, it would suggest revision of the set of base dimensions rather than a re-evaluation of integral exponents. The argument in favour is pragmatic: sometimes it is easier to write program code which temporarily creates a value whose dimension has fractional exponents. In this dissertation the former view prevails, and fractional exponents are not considered. However, most of the theory would apply just the same; any potential differences are highlighted as they arise.

I think this is essentially the reason why F# does not have fractional units, because the F# design quite closely follows Andrew Kennedy's work to make sure it is sound.

Update: With F# 4.0, support for fractional exponents has been implemented

OTHER TIPS

Units with fractional exponents are quite common and there is nothing special about them. Probably everyone in technology has come across a voltage noise density, which is measured per sqrt(Hz). This makes a lot of sense physically, the noise power is proportional to the bandwidth, and the noise voltage is the sqrt of the power, no strange mathematics here.

To create a new base unit every time one comes across a fractional power exponent is not the right approach.

These units are not SI units and their use breaks library compatibility. If you define the sqrtHz as a new unit and I define the rootHz, our code can't work together. Anyway, I would need to introduce quite a big set of base units to have a complete set Hz^-2, Hz^3, Hz^-5,... Just to offer rational exponents seems to be the better choice, btw. Boost.units does so.

Absence of literally fractional power units of measure does not anyhow discounts F# unit facility as it allows presenting seemingly fractional exponent unit relationships the other way around having smallest fraction as a base dimension:

let takeSqrt (x: float<_>) = sqrt(x)

has inferred signature of float<'u ^ 2> -> float<'u> this way avoiding introduction of imaginary "naturally fractional" float<'u> -> float<'u^1/2>.

let moreComplicated (x: float<_>) (y: float<_>) =
    sqrt(x*x + y*y*y)

has inferred signature of float<'u ^ 3> -> float<'u ^ 2> -> float<'u ^ 3>, where all unit measure conversions stay valid relative to some derived implicit base dimension float<'u>.

The fact that the piece of code below

[<Measure>]type m
let c = sqrt(1.0<m>)

does not even compile with diagnostics The unit of measure 'm' does not match the unit of measure ''u ^ 2' can be considered as a blame, or a blessing, but is a clear indication that the unit measure checks are in place.

EDIT: After reading OP's comment and the except from Andrew Kennedy's paper, it appears @nicolas is correct -- F# doesn't support units of measure with fractional exponents.

Shouldn't the answer be as easy as saying, yes, hertz are measured in s^-2 which is the same as s^(1/2)? There ya' go. Also, I like the philosophical idea of using , say m^(1/2) if it came up in calculations and perhaps one day understanding what that unit means in the literal sense.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top