我不明白F#中的价值限制是如何运作的.我已经阅读了wiki中的解释以及MSDN文档.我不明白的是:
例如,为什么这给了我一个价值限制错误(取自这个问题):
let toleq (e:float<_>) a b = (abs ( a - b ) ) < e
Run Code Online (Sandbox Code Playgroud)
但这不是:
let toleq e (a:float<_>) b = (abs ( a - b ) ) < e
Run Code Online (Sandbox Code Playgroud)这一点可以概括......
let is_bigger a b = a < b
Run Code Online (Sandbox Code Playgroud)
但这不是(它被指定为int):
let add a b = a + b
Run Code Online (Sandbox Code Playgroud)为什么带隐式参数的函数会生成值限制:
这个:
let item_count = List.fold (fun acc _ -> 1 + acc) 0
Run Code Online (Sandbox Code Playgroud)
对此:
let item_count l = List.fold (fun acc _ …Run Code Online (Sandbox Code Playgroud)我收到以下错误:
错误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 = …Run Code Online (Sandbox Code Playgroud) 我想从:
let a = fun x ->
x
|> f
|> g
Run Code Online (Sandbox Code Playgroud)
这样的事情:
let a = |> f
|> g
Run Code Online (Sandbox Code Playgroud)
我试过了:
let a = (<|) f
|> g
Run Code Online (Sandbox Code Playgroud)
和类似的