【问题标题】:Why there is a type inference error in this sample为什么此示例中存在类型推断错误
【发布时间】:2013-03-01 08:19:40
【问题描述】:

我在这个 sn-p 上收到“基于此程序点之前的信息查找不确定类型的对象”错误:

let a = [|"a"; "bb"|]
let n = Array.mapi (fun i x -> (i * x.Length)) a

它有什么问题?当我将光标悬停在它上方时,Visual Studio F# Interactive 正确地将 x 的类型显示为字符串。为什么一定要写:

let a = [|"a"; "bb"|]
let n = Array.mapi (fun i (x:string) -> (i * x.Length)) a

编译成功?

【问题讨论】:

    标签: f#


    【解决方案1】:

    类型检查器从左到右工作。由于这个原因,编译器没有足够的信息来推断x 的正确类型。

    解决此问题的最简单方法是将a 放在开头:

    let n = a |> Array.mapi (fun i x -> (i * x.Length))
    

    编译器将知道a 的类型为string [],因此x 的类型为string

    另一种选择是使用静态函数:

    let n = Array.mapi (fun i x -> (i * String.length x)) a
    

    String.length 采用string,因此string 成为x 的推断类型。

    【讨论】:

    • 这就解释了为什么编译器会出现问题,但是为什么VS IntelliSense在推断类型方面没有问题呢?它比编译器更聪明吗?
    猜你喜欢
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 2011-03-10
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多