3

我收到以下错误:

错误 2 值限制。该值'gbmLikelihood'已被推断为具有泛型类型 val gbmLikelihood : (float -> '_a -> float [] -> float) when '_a :> seq<float> 将参数设为'gbmLikelihood'显式,或者,如果您不打算使其成为泛型,请添加类型注释。

而这种类型正是我想要的。我必须做些什么才能让它工作,为什么它在没有干预的情况下不能工作?

编辑:
错误来自这个文件(它很短,所以我粘贴了整个文件):

module Likelihood
open System

let likelihood getDrift getVol dt data parameters =
    let m = getDrift data parameters
    let s =  getVol data parameters
    let N = float (Seq.length data)
    let sqrt_dt = Math.Sqrt dt
    let constant = -0.5*Math.Log(2.0*Math.PI*dt)*N
    let normalizedResidue observation = (observation - (m - 0.5*s*s)*dt)/(s*sqrt_dt) 
    let residueSquared observation = 
        let r = normalizedResidue observation in r*r
    let logStdDev = Math.Log s
    constant - logStdDev*N - 0.5* (data |> Seq.sumBy residueSquared) 

let gbmLikelihood = likelihood (fun data p -> Array.get p 0) (fun datac p -> Array.get p 1)
4

2 回答 2

7

当您声明具有泛型类型的时,可能会发生此错误。例如,参见过去的 SO question。在您的情况下,该类型表明您正在尝试定义一个函数,但编译器并不将其视为句法函数。如果您执行一些效果,然后使用 lambda 语法返回函数,就会发生这种情况:

let wrong = 
  printfn "test"
  (fun x -> x)

为避免该问题,您需要使用函数语法编写函数:

printfn "test"
let wrong x = x

编辑:在您的具体示例中,该函数gbmLikelihood是作为部分函数应用程序的结果创建的。要使其编译,您需要将其转换为显式函数:

let gbmLikelihood parameters = 
  likelihood (fun data p -> Array.get p 0) (fun datac p -> Array.get p 1) parameters 

有关为什么会出现这种情况及其工作原理的更多信息,另请参阅这篇关于 F# 中的值限制的精彩文章

于 2012-06-13T13:12:48.880 回答
1

除了将参数gbmLikelihood设为显式之外,您还可以只向函数添加泛型类型注释:

let gbmLikelihood<'a> = 
    likelihood (fun data p -> Array.get p 0) (fun datac p -> Array.get p 1)
于 2015-05-13T17:13:45.830 回答