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.

しかし、マウス ポインターが の上に置かれると、IntelliSense はそれが であるとt正しく言います。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())

の型はsを使用する前に利用Array.mapできるため、型チェッカーは の型を推測でき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 に答える