相关疑难解决方法(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# 错误:“要么使‘it’的参数显式,要么如果您不希望它是通用的,请添加类型注释。”

在 F# 交互式 shell 中dotnet fsi,我尝试flip像 Haskell 中那样测试函数,

flip :: (a -> b -> c) -> b -> a -> c

> let flip = fun f -> fun a -> fun b -> f(b)(a);;
val flip: f: ('a -> 'b -> 'c) -> a: 'b -> b: 'a -> 'c
Run Code Online (Sandbox Code Playgroud)

然后,研究内置管道运算符,

> (|>);;
val it: ('a -> ('a -> 'b) -> 'b)
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都很好。

现在,

> flip (|>);;

  flip (|>);;
  ^^^^^^^^^

/..... : error FS0030: Value …
Run Code Online (Sandbox Code Playgroud)

f# haskell type-systems functional-programming

2
推荐指数
1
解决办法
205
查看次数