3

F# と filehelpers を使用して parse CSVのリンクをたどりました。次のコードでコンパイラ エラーが発生しました"The record class oneRow need a constructor with no args (public or private)"

[<DelimitedRecord(",")>]
type oneRow=
  class
    [<FieldConverter(ConverterKind.Date, "M/d/yyyy")>]
    val date: DateTime
    val value: bool
  end
let engine = new FileHelperEngine(typeof<oneRow>)
let tmp = engine.ReadFile("test.csv")

EDIT ソリューションは、C#バージョンよりもかなり冗長に見えます。を追加する必要があり()mutable[<DefaultValue>]

  type oneRow() =
      class
        [<FieldConverter(ConverterKind.Date, "M/d/yyyy")>]
        [<DefaultValue>]
        val mutable date: DateTime
        [<DefaultValue>]
        val mutable value: bool
      end

ただし、同様のコードは、コンストラクターを指定しなくても C# で機能します。F# コードの修正を手伝ってくれる人はいますか? ありがとう。

4

5 に答える 5

2

C#はコンストラクターを作成します。F#はそうではありません(おそらく、パラメーターのないコンストラクターは可変性を意味するため、正確には推奨されません)。

たとえば、コードでは、これらのプロパティをどのように設定しますが、それらは依然として不変です。

于 2011-02-11T16:10:24.523 に答える
2

冗長な構文について - より良くすることができます。サンプルは少し前 (2 年前) に作成されたため、まだ少し古い構文を使用しています。次のようなものを記述できるように更新できます。

[<DelimitedRecord(",")>]
type OneRow
   ( [<FieldConverter(ConverterKind.Date, "M/d/yyyy")>] 
     date:DateTime,
     value:bool ) =
   member x.Date = date
   member x.Value = value

私はこれがずっと良いと信じています (また、注釈をコンストラクターに移動することで、型に独自の機能を実装したり、いくつかのフィールドを非表示にしたりすることもできます)。実行する必要がある唯一の変更は、パーサーを変更して、コンストラクターのパラメーター (フィールドではなく) の属性を検索することです。

于 2011-02-11T16:44:37.700 に答える
0

type oneRow () =はい、括弧で囲む必要があります

于 2011-02-11T16:08:34.993 に答える
0

エラー メッセージから、oneRow に ctor を追加するとうまくいくと思います。

new () = { date = new DateTime() ; value = false}
于 2011-02-11T16:09:05.057 に答える
0

FileHelpers に関する投稿のほとんどはかなり古いものです。場合によっては、csv タイプ プロバイダーの代わりに使用すると便利です。F# レコードの属性を使用CLIMutableして、デフォルトのコンストラクターを持つことができます。この場合、FileHelpers は csv ファイルを喜んで読み書きします。

#if INTERACTIVE
#I @"..\packages\FileHelpers\lib\net45"
#r "FileHelpers.dll"
#endif

open FileHelpers
open System

[<DelimitedRecord(",");CLIMutable>]
type TestFileHelp =
    {test1:string
     test2:string
     [<FieldConverter(ConverterKind.Date, "yyyy/MM/dd")>]
     date:DateTime
    }

let f1 = [|{test1="a";test2="b";date=DateTime.Now};{test1="c";test2="d";date=DateTime.Now}|]
let fengine = new FileHelperEngine<TestFileHelp>()
fengine.WriteFile(@"c:\tmp\testrec.csv",f1)    
于 2016-12-29T06:20:52.723 に答える