F#编译错误

时间:2015-05-07 19:05:33

标签: f#

我有以下导致编译错误的F#代码:

persistence.fs(32,21):error FS0072:根据此程序点之前的信息查找不确定类型的对象。在此程序点之前可能需要类型注释来约束对象的类型。这可能允许解析查找。

错误位于“serializer.write ....”行

任何帮助都将不胜感激。

score = 0;

1 个答案:

答案 0 :(得分:2)

如果您可以调用write这样的serializer.write(elem, writer_)函数,那就不错了,但是你不能这样做。你必须这样调用它:

(^W: (member write : ('T * BinaryWriter) -> unit) (serializer, (elem, writer_)))

完整代码块:

type BinaryPersistenceOut<'T, ^W when ^W: (member write : ('T * BinaryWriter) -> unit)> (fn: string, serializer: ^W) as this = 
    let writer_ = new BinaryWriter(File.Open(fn, FileMode.Append))
    let mutable localdata_ = new LocalData<'T>([])
    let serializer_ = serializer
    let NUM_SECS_IN_MIN = 60
    let NUM_MSECS_IN_SEC = 1000
    let NUM_MIN_BETWEEN_COMMITS = 2
    let TIME_TO_WAIT = 15
    let closed_ = false

    let freq_ = NUM_MIN_BETWEEN_COMMITS * NUM_SECS_IN_MIN * NUM_MSECS_IN_SEC
    let path_ = fn
    let timer_ = new System.Timers.Timer((float) (NUM_MIN_BETWEEN_COMMITS * NUM_MSECS_IN_SEC) )

    let writetofile = 
        fun (arg: Timers.ElapsedEventArgs ) ->
            lock localdata_.lock_ ( fun () -> 
             if closed_ = false then
                for elem in localdata_.elements_ do
                    (^W: (member write : ('T * BinaryWriter) -> unit) (serializer, (elem, writer_)))
             )  

    do 
        timer_.Elapsed.Add(writetofile)

警告:这会编译,但我不知道它是否符合您的要求。