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の質問を参照してください。あなたの場合、型は関数を定義しようとしていることを示唆していますが、コンパイラーはそれを構文関数として認識しません。これは、いくつかのエフェクトを実行してから、ラムダ構文を使用して関数を返す場合に発生する可能性があります。

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 に答える