约束函数的更短方法

时间:2010-12-13 16:04:14

标签: f# type-constraints

我正在寻找一种更短的方式(如果有的话)来约束一个函数。 E.g。

let inline sincos (a:'T) =
    let y = sin a
    let x = cos a
    y, x

要使用此功能,'T需要同时支持SinCos静态成员。 我可以用它来约束它在float32上工作:

let sincosf = sincos : float32 -> float32 -> float32

或使用一些通配符:

let sincosf = sincos : float32 -> _

我的问题是,是否可以向sincos添加类型参数,所以我只需要写:

let sincosf = sincos<float32>

提前致谢。

1 个答案:

答案 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

我认为这是一个编译错误。