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

F# 如何使用F中重载的指定构造函数创建泛型类型#,f#,F#,我希望能够定义一个F#类型,它是泛型的,但具有指定类型的重载。特别是,我想定义一个图表打印类型,它采用一个Xs序列,一个Ys序列,任何数字类型。但是,如果没有提供X,我想提供一个自动的整数范围。问题是,这打破了我的类型的一般性。对于下面的示例代码,当我放入重载时,我得到以下错误:Warning 2此构造导致代码没有类型注释所指示的那么通用。类型变量“T”已被约束为类型“int”。 type Plot(X : seq<'T>, Y : seq<seq<'U>>)

我希望能够定义一个F#类型,它是泛型的,但具有指定类型的重载。特别是,我想定义一个图表打印类型,它采用一个Xs序列,一个Ys序列,任何数字类型。但是,如果没有提供X,我想提供一个自动的整数范围。问题是,这打破了我的类型的一般性。对于下面的示例代码,当我放入重载时,我得到以下错误:
Warning 2此构造导致代码没有类型注释所指示的那么通用。类型变量“T”已被约束为类型“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)
类型图(X:seq>)=
//其他绘图代码
打印“我是一个绘图仪”
//未提供X时的构造函数重载

新建(Y:seq您可以使用静态成员执行此操作。此外,类型定义中缺少类型参数

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)
类型图(X:seq>)=
//其他绘图代码
打印“我是一个绘图仪”
//没有提供X时的静态成员
静态成员创建>)=
设Xs=List.init(Seq.length Y)id
绘图(X,Y)

这是一个很好的解决方案,但理想情况下,我希望能够使用重载构造函数来实现这一点。它主要用于编写脚本,如果我可以在不考虑太多单独方法的情况下直接将数据输入,这将是一个优势。在构造函数中这是不可能的,但您可以重载
创建
并实现相同的效果。这就是我最终采用的解决方案。一个接受DU的私有构造函数,以及一个调用它的重载的
create
。我不知道你为什么需要DU。您拥有的构造函数处理这两种情况。