我有类似下面的功能:F#类型推断,有点泛型函数参数
let inline fmingd f' x0 alpha =
let rec step x i =
if i >= 100 then x
else step (x - alpha*(f' x)) (i+1)
step x0 0
这是很普通的浮筒的工作:
let f' x = 4.*x + 3.
let fminx = fmingd f' 0. 0.1
...与(MathNet.Numeric )矢量:
let f' (x:Vector<float>) = (x.[0], x.[1]) |> fun (x, y) -> vector [4.*x + 3.; 8.*y + 5.]
let fminx = fmingd f' (vector [0.;0.]) 0.1
...或其他任何支持正确运算符(*和 - )的运算符。
我希望做的是限制参数阿尔法浮动(同时保持其他参数通用):
let inline fmingd f' x0 (alpha:float) = ...
这应该工作,因为载体有运营商(*)使用float - >矢量 - >矢量和运算符( - )与矢量 - >矢量 - >矢量。
但是,只要我这样做的功能变成非泛型..它只接受和返回浮动。它的类型签名变为:
val inline fmingd : f':(float -> float) -> x0:float -> alpha:float -> float
我能做些什么来保持f',x0和fmingds返回值的一般性,同时限制alpha浮动?
我试图想出以下打动F#编译器:
let inline fmingd (f':^a -> ^a) (x0:^a) (alpha:float) : ^a
when ^a : (static member (*) : float * ^a -> ^a) and
^a : (static member (-) : ^a * ^a -> ^a) =
let rec step x i =
if i >= 100 then x
else step (x - alpha*(f' x)) (i+1)
step x0 0
...但在阿尔法·(F” x)的它仍然告诉我:
“这构造使得代码不如 类型注释所指示的类型变量'a被限制为类型 'float'。“
..这导致与上述相同的全浮标型签名。