使用时
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#吗?
答案 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
该函数现在可以与int64
和int
参数一起使用:
f 1024L 2
f 1024 2
我前段时间写了一篇关于writing generic numeric code in F#的文章,你也觉得它很有用。