相关疑难解决方法(0)

了解F#值限制错误

我不明白F#中的价值限制是如何运作的.我已经阅读了wiki中的解释以及MSDN文档.我不明白的是:

  1. 例如,为什么这给了我一个价值限制错误(取自这个问题):

    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)
  2. 这一点可以概括......

    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)
  3. 为什么带隐式参数的函数会生成值限制:

    这个:

    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)

f# type-inference value-restriction

20
推荐指数
2
解决办法
3582
查看次数

F#中的泛型类型注释

我收到以下错误:

错误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)

f#

3
推荐指数
1
解决办法
1013
查看次数

如何使这个F#代码更紧凑

我想从:

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)

和类似的

f# pipe composition

3
推荐指数
1
解决办法
110
查看次数