3

我在此代码段上收到“根据此程序点之前的信息查找不确定类型的对象”错误:

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

编译成功?

4

1 回答 1

6

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

克服这个问题的最简单方法是放在a开头:

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

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

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

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

String.length接受 a string,因此string成为 的推断类型x

于 2013-03-01T08:53:55.587 回答