Вопрос по f# – Общий тип аннотации в F #

3

Я получил следующую ошибку:

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)
Можете ли вы опубликовать пример, демонстрирующий ошибку? pad
@pad, пожалуйста, смотрите редактирование. Grzenio

Ваш Ответ

2   ответа
7

value это имеет общий тип. Смотри напримерэтот прошлый ТАК вопрос, В вашем случае тип предполагает, что вы пытаетесь определить функцию, но компилятор не видит ее как синтаксическую функцию. Это может произойти, если вы выполните некоторые эффекты, а затем вернете функцию, используя лямбда-синтаксис:

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

Чтобы избежать проблемы, вам нужно написать функцию, используя синтаксис функции:

printfn "test"
let wrong x = x

EDIT: В вашем конкретном примере функцияgbmLikelihood создается в результате частичного применения функции. Чтобы сделать его компилируемым, вам нужно превратить его в явную функцию:

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

Для получения дополнительной информации, почему это так & amp; как это работает, см. также этот великийстатья об ограничении значения в F #.

Error: User Rate Limit Exceeded Grzenio
Error: User Rate Limit Exceededsyntactic functionError: User Rate Limit Exceeded
1

gbmLikelihood в явном виде вы также можете просто добавить аннотацию универсального типа в функцию:

let gbmLikelihood<'a> = 
    likelihood (fun data p -> Array.get p 0) (fun datac p -> Array.get p 1)
Error: User Rate Limit Exceeded

Похожие вопросы