是否可以在F#中为int和long(float,byte .etc)编写函数?

时间:2014-02-24 01:04:23

标签: f# int long-integer

使用时

let add a b = a + b

适用于int。和

let add2 a b:float = a + b

为浮动工作。

是否可以在F#中为int和long(float,byte .etc)写一个函数?

我需要一个函数,其“a”适用于int和long,就像这样:

let f a b = a >>> b 
let f (a:int64) b = a >>> b

可以用F#吗?

1 个答案:

答案 0 :(得分:3)

如果要编写可以使用多种不同数值类型的函数,则需要使用inline和“静态成员约束”。问题是普通的.NET泛型无法捕获像“支持+运算符”这样的约束。

要使您的样本add功能通用,您可以使用inline

let inline add x y = x + y

当您查看推断类型时,您会看到如下内容:

val inline add :
  x: ^a -> y: ^b ->  ^c
    when ( ^a or  ^b) : (static member ( + ) :  ^a *  ^b ->  ^c)

这基本上说可以在支持+运算符的任何两个参数上调用该函数。请注意,这只能起作用,因为函数是inline,因此F#编译器不必依赖.NET来表达约束。同样适用于>>>运算符:

let inline f a b = a >>> b 

该函数现在可以与int64int参数一起使用:

f 1024L 2
f 1024 2

我前段时间写了一篇关于writing generic numeric code in F#的文章,你也觉得它很有用。