如何在F#中使用重载的指定构造函数创建泛型类型

时间:2013-06-25 20:47:09

标签: f#

我希望能够定义一个通用的F#类型,但是具有指定类型的重载。特别是,我想定义一个图表绘制类型,它采用一系列X,以及任何数值类型的Y序列。但是,如果没有提供X,我想提供一个自动的整数范围。问题是这打破了我的类型的通用性。下面是示例代码,当我输入重载时,出现以下错误:Warning 2 This construct causes code to be less generic than indicated by the type annotations. The type variable 'T has been constrained to be type 'int'.

type Plot(X : seq<'T>, Y : seq<seq<'U>>) =

    // Other plotting code
    do printfn "I am a plotter"

    // Constructor overload for when no Xs are provided
    new (Y : seq<seq<'U>>) = let Xs = List.init (Seq.length Y) id
                             Plot(Xs, Y)

此外,'U已被约束为obj类型。有没有办法在没有obj并对double强制执行的情况下执行此操作?我觉得我遗漏了关于类型系统的一些基本信息......

1 个答案:

答案 0 :(得分:0)

您可以使用静态成员执行此操作。此外,类型定义中缺少类型args。

type Plot<'T, 'U>(X : seq<'T>, Y : seq<seq<'U>>) =

    // Other plotting code
    do printfn "I am a plotter"

    // Static member for when no Xs are provided
    static member Create<'V>(Y : seq<seq<'V>>) = 
        let Xs = List.init (Seq.length Y) id
        Plot(Xs, Y)