带有泛型的F#类:'建设者已弃用'错误

时间:2010-05-08 12:36:51

标签: class f# generics

我正在尝试创建一个存储时间序列数据的类 - 按组进行组织,但是我有一些编译错误,所以我剥离了基础知识(只是一个简单的实例化)并且仍然无法克服编译错误。我希望有人可能以前见过这个问题。 Clas定义为:

type TimeSeriesQueue<'V, 'K when 'K: comparison> = class
        val private m_daysInCache: int  
        val private m_cache: Map<'K, 'V list ref > ref;
        val private m_getKey: ('V -> 'K) ;

        private new(getKey)  = {
            m_cache = ref Map.empty
            m_daysInCache  = 7 ;
            m_getKey = getKey ;
        }

end

所以对我来说看起来不错(可能不是,但没有任何错误或警告) - 实例化会收到错误:

type tempRec = {
    someKey: string ;
    someVal1: int ;
    someVal2: int ;
}

let keyFunc r:tempRec = r.someKey
// error occurs on the following line
let q = new TimeSeriesQueue<tempRec, string> keyFunc
  

不推荐使用此构造:使用   类型语法'int C'和'C   '这里不允许这样做。考虑   调整此类型以写入   形式'C'

注意这可能是简单的愚蠢 - 我刚从假期回来,我的大脑仍处于时区滞后...

1 个答案:

答案 0 :(得分:7)

编译器只是说你需要在括号中包含构造函数的参数:

// the following should work fine
let q = new TimeSeriesQueue<tempRec, string>(keyFunc)

还有一些其他问题 - 构造函数需要是公共的(否则你不能调用它),keyFunc的参数也应该在括号中(否则,编译器会认为类型注释是功能的结果):

let keyFunc (r:tempRec) = r.someKey

您也可以考虑使用隐式构造函数语法,这使得F#中的类声明更加简单。构造函数的参数自动在类的主体中可用,您可以使用let声明(私有)字段:

type TimeSeriesQueue<'V, 'K when 'K: comparison>(getKey : 'V -> 'K) =
  let daysInCache = 7  
  let cache = ref Map.empty

  member x.Foo() = ()