2

私は次の方法を持っています:

  member this.addColumnWithHeading heading column =
    this.addColumn (seq { yield heading; yield! (column |> Seq.map string)})

これは、文字列の見出しと任意のシーケンス (この場合は seq にコンパイルされます) を受け取り、文字列のシーケンスを作成し、このデータを使用して別のメソッドを呼び出します。ただし、フロートのシーケンスである column では機能しません。

Error   1   The type 'obj' does not match the type 'float'  C:\Users\ga1009\Documents\PhD\cpp\pmi\fsharp\pmi\Program.fs 138

addColumnWithHeadingフロートでも機能するようにメソッドを定義するにはどうすればよいですか?

4

2 に答える 2

4

組み込みstring関数は、静的に解決されるジェネリック パラメーターを使用するインライン関数です。addColumnWithHeadingメソッドが宣言されていないためinline、F# の型推論では、シーケンス内の値が型であると想定する必要がありますobj

ただし、簡単な解決策があります。関数を交換して、シーケンス内の値stringを「手動で」呼び出すようにします。.ToString()これを行うと、F# はシーケンスに標準のジェネリック パラメーター型を使用できるようになるため、任意の型のシーケンスを渡すことができます。

member this.addColumnWithHeading heading column =
    seq {
        yield heading
        yield! Seq.map (fun x -> x.ToString()) column }
    |> this.addColumn
于 2012-08-28T15:07:06.537 に答える
3

stringインライン化されているため、引数の型はコンパイル時に解決する必要があります。メンバーはインライン化されていないため、可能な最も一般的なタイプを選択します (objこの場合)。メソッドをインライン化すると、columnジェネリックのままにすることができます。

member inline x.AddColumnWithHeading(heading, column) =
  x.AddColumn(seq { yield heading; yield! Seq.map string column })

編集

ジャックの回答へのコメントによると、の使用をインライン化する必要はないかもしれませんstring。確かに、column常にseq<float>型注釈を追加する必要があります。seq<string>文字列変換を関数の外に渡して移動することも別のオプションです。

于 2012-08-28T15:07:42.987 に答える