为什么此示例中存在类型推断错误

时间:2013-03-01 08:19:41

标签: f#

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

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

成功编译?

1 个答案:

答案 0 :(得分:6)

类型检查器从左到右工作。由于这个原因,编译器没有足够的信息来推断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的推断类型。