gpt4 book ai didi

f# - F# 中的泛型类型注释

转载 作者:行者123 更新时间:2023-12-01 00:34:27 24 4
gpt4 key购买 nike

我收到以下错误:

Error 2 Value restriction. The value 'gbmLikelihood' has been inferred to have generic type val gbmLikelihood : (float -> '_a -> float [] -> float) when '_a :> seq<float> Either make the arguments to 'gbmLikelihood' explicit or, if you do not intend for it to be generic, add a type annotation.

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

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

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)

最佳答案

当您声明具有泛型类型的 时,可能会发生此错误。参见示例 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# .

关于f# - F# 中的泛型类型注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11015465/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com