F# 将测量单位类型提高到指定功率

F# 将测量单位类型提高到指定功率,f#,F#,是否可以为度量类型创建pow函数? f#中的pow函数仅将int作为参数,然后Math类中的pow函数采用float-但不允许float 我首先想到: let rec myPow(x:float<cm>,y:int) = if y = 0 then x else myPow(x*x, y - 1) let rec myPow(x:float,y:int)= 如果y=0,那么x else-myPow(x*x,y-1) 可能会成功,但很明显,每次遇到else行时,它都

是否可以为度量类型创建pow函数? f#中的pow函数仅将
int
作为参数,然后
Math
类中的pow函数采用
float
-但不允许
float

我首先想到:

let rec myPow(x:float<cm>,y:int) =
    if y = 0 then x
    else myPow(x*x, y - 1)
let rec myPow(x:float,y:int)=
如果y=0,那么x
else-myPow(x*x,y-1)
可能会成功,但很明显,每次遇到else行时,它都会更改返回类型


有什么建议吗?

我认为那是不可能的。如果功率为2,则要求函数返回
,如果功率为3,则要求函数返回
,以此类推。这使得函数基于计算返回不同的“类型”,这在静态类型和类型安全语言中显然是不可能的。不幸的是,我不认为度量单位可以用“泛型”来达到更进一步的效果


您的函数只能有一个静态返回类型。

Ankur是正确的-您不能这样做(如果不诉诸会破坏单元的黑客攻击)

也许对这个问题更清楚的描述是,
pow
函数的类型取决于参数的值,而F#不允许这样做。您可以想象,如果只使用文字作为第二个参数,这会起作用,但如果使用表达式,则会变得很棘手:

pow a 3 // Assuming a = 1.0<cm>, the return type is float<cm ^ 3>
pow a n // Assuming a = 1.0<cm>, the return type is float<cm ^ n>

编辑:我将源代码发布到F#snippets,以便您可以看到推断的类型:

如前所述,您不能。如果编译时不知道
y
,则无法在F#type系统中对表达式进行类型检查

我怀疑您只会将myPow用于一些小的已知常量。在这种情况下,您可以使用以下函数并保持静态键入:

let inline pow2 (x: float<'a>) : float<'a^2> = pown (float x) 2 * 1.<_>
let inline pow3 (x: float<'a>) : float<'a^3> = pown (float x) 3 * 1.<_>
let inline pow4 (x: float<'a>) : float<'a^4> = pown (float x) 4 * 1.<_>
let inline pow5 (x: float<'a>) : float<'a^5> = pown (float x) 5 * 1.<_>
让内联pow2(x:float=pown(float x)2*1。
让内联功率3(x:float=pown(float x)3*1。
让内联pow4(x:float=pown(float x)4*1。
让内联功率5(x:float=pown(float x)5*1。

请注意,您的代码计算的是
x^(2^y)
,而不是
x^y
+1您的答案是正确的-我只是添加了一些细节-希望-澄清原因。
let inline pow2 (x: float<'a>) : float<'a^2> = pown (float x) 2 * 1.<_>
let inline pow3 (x: float<'a>) : float<'a^3> = pown (float x) 3 * 1.<_>
let inline pow4 (x: float<'a>) : float<'a^4> = pown (float x) 4 * 1.<_>
let inline pow5 (x: float<'a>) : float<'a^5> = pown (float x) 5 * 1.<_>