1

我一直遇到以下问题:

(System.Console.ReadLine ()).Split [|'('; ')'|]
|> Array.filter (fun s -> not (System.String.IsNullOrEmpty (s)))
|> Array.map (fun s -> s.Split [|','|])
|> Array.map (fun s -> Array.map (fun t -> t.Trim ()) s) (* t.Trim () is underlined with a red squiggly line *)
|> [MORE CODE]

与红色波浪线相关的错误是:

Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved.

但是当鼠标指针悬停在 上时t,IntelliSense 正确地说ttype string

我可以通过编写来绕过错误fun (t : string) -> [CODE],但我想知道为什么 Visual Studio 在已经正确检测到变量的类型时会绘制波浪线。这是试用版中的一个简单错误,还是我误解了 F# 的类型推断?

提前感谢您的回复。

4

1 回答 1

7

F# 智能感知和 F# 类型检查器之间存在一些差距。

类型检查器按顺序从左到右工作。您的问题可以通过改变来解决:

fun s -> Array.map (fun t -> t.Trim()) s

fun s -> s |> Array.map (fun t -> t.Trim())

由于 type ofs在使用之前是可用Array.map的,因此类型检查器能够推断出 type of t

评论:

使用实例方法时通常会发生此错误。您可以用带有额外类型注释和重构的静态函数替换这些方法,以使您的代码更具可组合性:

let split arr (s: string) = s.Split arr
let trim (s: string) = s.Trim()

System.Console.ReadLine()
|> split [|'('; ')'|]
|> Array.filter (not << System.String.IsNullOrEmpty)
|> Array.map (split [|','|])
|> Array.map (Array.map trim)
于 2012-06-19T07:39:39.017 回答