2011-02-11 52 views
3

我跟着parse CSV using F# and filehelpers的鏈接。有編譯器錯誤下面的代碼"The record class oneRow need a constructor with no args (public or private)"F#類的構造函數沒有參數---使用fhelp的filehelpers出錯#

[<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") 

編輯 的解決方案看起來比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#代碼嗎?謝謝。

+2

爲了使它不那麼詳細,你可以省略`class`和`結束`使用F#light語法(這是目前的默認設置)。還要注意,在F#中,不變性是默認的,所以你必須走出自己的方式來製作可變類型。 – 2011-02-11 16:43:08

回答

2

C#會爲您創建一個構造函數。 F#沒有(大概是因爲無參數的構造函數暗示可變性,所以也沒有完全鼓勵)。

例如,在你的代碼中 - 你將如何設置這些屬性,它們仍然是不可變的。

0

是的,它應該是type oneRow() =基於錯誤信息的括號

0

,我想,如果一個構造函數添加到oneRow它會工作。

new() = { date = new DateTime() ; value = false} 
2

關於冗長的語法 - 它可以做得更好。該樣本是在前一段時間(2年)編寫的,因此它仍然使用一些舊的語法。它可以被更新,以允許寫的東西是這樣的:

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

我相信這是一個要好很多,(並通過移動註釋構造函數,你也可以實現自己的功能在類型和如隱藏某些字段) 。唯一需要做的改變是修改解析器以在構造函數參數(而不是字段)上查找屬性。

+1

這不會爲日期轉換行編譯,但上面的舊格式在vs2010上編譯。 – ahala 2011-02-12 00:13:36

0

大多數關於FileHelpers的帖子都是過時的。在某些情況下,儘管使用csv類型提供程序非常好用。人們可以使用CLIMutable屬性上的F#記錄有一個默認的構造函數,在這種情況下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)  
相關問題