我正在寻找一种更短的方式(如果有的话)来约束一个函数。 E.g。
let inline sincos (a:'T) =
let y = sin a
let x = cos a
y, x
要使用此功能,'T需要同时支持Sin
和Cos
静态成员。
我可以用它来约束它在float32上工作:
let sincosf = sincos : float32 -> float32 -> float32
或使用一些通配符:
let sincosf = sincos : float32 -> _
我的问题是,是否可以向sincos
添加类型参数,所以我只需要写:
let sincosf = sincos<float32>
提前致谢。
答案 0 :(得分:2)
确实,let sincosf = sincos<float32>
会给你一个警告,但会按原样运作。
正如我在评论中所指出的那样,应该可以在sincos
的定义上明确提供一个类型参数来删除警告。但是,这也需要指定对该参数的所有推断约束,这可能有点难看。在这种情况下,F#编译器意外地拒绝了该定义:
let inline sincos< ^t when ^t : (static member Sin : ^t -> ^t)
and ^t : (static member Cos : ^t -> ^t)> (a: ^t) =
let y = sin a
let x = cos a
y, x
我认为这是一个编译错误。