我在这个片段中收到“根据此程序点之前的信息查找不确定类型的对象”错误:
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
成功编译?
答案 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
的推断类型。