我如何实现静态解析类型参数?

4

我该如何实现静态解析类型参数?

具体来说,我想让一个函数适用于所有数值类型。

我尝试了以下方法:

let isAbsoluteProductGreaterThanSum a b =
     Math.Abs(a * b) > (a + b)

let inline isAbsoluteProductGreaterThanSum a b =
     Math.Abs(a * b) > (a + b)

let inline isAbsoluteProductGreaterThanSum ^a ^b =
     Math.Abs(^a * ^b) > (^a + ^b)

let inline isAbsoluteProductGreaterThanSum (val1:^a) (val2:^b) =
     Math.Abs(val1 * val2) > (val1 + val2)

我查看了这篇文档,但仍未能解决我的问题。

2个回答

10

这将完美地发挥作用:

let inline isAbsoluteProductGreaterThanSum a b =
    abs(a * b) > (a + b)

这个的签名将会像这样:

val isAbsoluteProductGreaterThanSum: 
    a:  ^a (requires static member ( * ) and static member ( + ) )->
    b:  ^b (requires static member ( * ) and static member ( + ) )
    -> bool

1

我想也许你需要使用约束条件进行明确的制作,所以在这里提供给你:

let inline isAbsoluteProductGreaterThanSum'< ^a, ^b, ^c
                                       when (^a or ^b): (static member (+): ^a * ^b -> ^c)
                                       and  (^a or ^b): (static member (*): ^a * ^b -> ^c)
                                       and   ^c       : (static member Abs: ^c      -> ^c)
                                       and   ^c       :  comparison>
                                       a b =
     let productOfAb = ((^a or ^b): (static member (*): ^a * ^b -> ^c) (a, b))
     let sumOfAb     = ((^a or ^b): (static member (+): ^a * ^b -> ^c) (a, b))
     abs (productOfAb) > sumOfAb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接