我正在尝试创建一个存储时间序列数据的类 - 按组进行组织,但是我有一些编译错误,所以我剥离了基础知识(只是一个简单的实例化)并且仍然无法克服编译错误。我希望有人可能以前见过这个问题。 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'
注意这可能是简单的愚蠢 - 我刚从假期回来,我的大脑仍处于时区滞后...
答案 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() = ()