我收到以下错误:
错误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)
答案 0 :(得分:7)
当您声明具有泛型类型的值时,可能会发生此错误。请参阅示例this past 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
欲了解更多信息,为什么会这样呢?如何运作,另见这个伟大的article on value restriction in F#。
答案 1 :(得分:1)
除了明确gbmLikelihood
的参数外,您还可以在函数中添加泛型类型注释:
let gbmLikelihood<'a> =
likelihood (fun data p -> Array.get p 0) (fun datac p -> Array.get p 1)