Конструктор класса F # без аргументов --- ошибка при использовании filehelpers wtih f # - PullRequest
3 голосов
/ 11 февраля 2011

Я перешел по ссылке разбора CSV с помощью F # и filehelpers .получена ошибка компилятора для следующего кода "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 #?Благодарю.

Ответы [ 5 ]

2 голосов
/ 11 февраля 2011

Относительно подробного синтаксиса - это может быть сделано лучше.Образец был написан некоторое время назад (2 года), поэтому он все еще использует немного старый синтаксис.Он может быть обновлен, чтобы позволить писать что-то вроде этого:

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

Я считаю, что это намного лучше (и, перемещая аннотации в конструктор, вы также можете реализовать свою собственную функциональность в типе и, например, скрыть некоторыеполя).Единственное изменение, которое необходимо сделать, - это изменить синтаксический анализатор для поиска атрибутов по параметрам конструктора (а не по полям).

2 голосов
/ 11 февраля 2011

C # создаст вам конструктор.F # не делает этого (предположительно потому, что конструкторы без параметров подразумевают изменчивость, и поэтому не совсем приветствуются.)

Например, в вашем коде - как вы собираетесь устанавливать эти свойства, они все еще неизменны.

0 голосов
/ 29 декабря 2016

Большинство постов, касающихся 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)    
0 голосов
/ 11 февраля 2011

Основываясь на сообщении об ошибке, я думаю, что это будет работать, если ctor будет добавлен в oneRow.

new () = { date = new DateTime() ; value = false}
0 голосов
/ 11 февраля 2011

да, это должно быть type oneRow () = с круглыми скобками

...