使用operator(*)时如何防止类型推断选择`int`

时间:2015-01-19 22:54:33

标签: f# inline type-inference

我正在尝试定义以下函数(在Seq模块名称中共享空间)。

module Seq =

    let scale value sequence = 
        sequence 
        |> Seq.map (fun v -> v * value)

但是,类型推断强加了元素,值为int类型。我希望这个方法能够处理整数(8位,16位等),浮点数(单次和双次)等。

为什么类型推断会跳转到int,如何让这个函数更通用?

1 个答案:

答案 0 :(得分:5)

对于正常的函数声明,F#不会让你编写一个数字类型泛型的函数(.NET中的泛型约束不能表达约束,例如"有*运算符")

但是,如果将其标记为inline,F#将允许您编写通用数值函数。在这种情况下,它会在您调用函数时内联函数并将代码专门化为特定类型(类型系统将使用静态成员约束来表达要求)。

let inline scale value sequence = 
    sequence 
    |> Seq.map (fun v -> v * value)

您可以找到更多信息in a blog post I wrote some time ago