2

Seq には IEnumerable から Seq へのキャスト関数があるようですが、どうすれば機能するのでしょうか?

open System.Text.RegularExpressions;;
let v = Regex.Match("abcd", "(ab)");;
Seq.cast (v.Captures);;

これにより、

エラー FS0030: 値の制限。値 'it' はジェネリック型 val it を持つと推論されました: seq<'_a>
'it' を単純なデータ項として定義するか、明示的な引数を持つ関数にするか、ジェネリックにするつもりがない場合は、型注釈を追加します。

4

2 に答える 2

8

タイプについて明示してください。

Seq.cast<Match> (v.Captures)

それ以外の場合castは、正しい戻り値の型を推測するためのコンテキストが必要であり、そのような行自体では、使用する型推論にそのようなコンテキストはありません。

(この行は、非ジェネリックIEnumerableをジェネリックIEnumerable<Match>akaに変換しseq<Match>ます。)

于 2010-06-07T22:53:47.137 に答える
6

取得するタイプを指定するには、実際には 2 つの方法があります。Brian は、型パラメーターを関数に明示的に指定してこれを行う方法を投稿しました。

let res = Seq.cast<Match> v.Captures

もう 1 つのオプションは、任意の F# 式の前後に配置できる型注釈を使用し、式の型を指定することです。これにより、コンパイラの型推論をヒントにすることができます (一部の式に特定の型があることを示すことによって)。何らかの巧妙な方法で情報を提供すると、コンパイラは型パラメーターがSeq.castどうあるべきかを判断できます。いくつかの例:

// By specifying type of the value
let (res:seq<Match>) = Seq.cast v.Captures 

// By specifying return type of a function
let getCaptures () : seq<Match> = 
  // ...
  Seq.cast v.Captures

// By specifying element type when iterating over the result
for (m:Match) in Seq.cast v.Captures do
  // ...

すべてのオプションから、Brians (明示的) と私の 2 番目 (関数の戻り値の型) が最も慣用的なものだと思いますが、最も読みやすいと思われるオプションを選択できます。

于 2010-06-08T01:25:53.777 に答える