3

このスニペットで「このプログラム ポイントより前の情報に基づいて、不確定な型のオブジェクトを検索します」というエラーが表示されます。

let a = [|"a"; "bb"|]
let n = Array.mapi (fun i x -> (i * x.Length)) a

それの何が問題なのですか?Visual Studio F# Interactive では、カーソルを x の上に置くと、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 []、したがってxがであることを認識しますstring

もう 1 つの方法は、静的関数を使用することです。

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

String.lengthは を受け取るstringためstring、 の推定型になりxます。

于 2013-03-01T08:53:55.587 に答える