【问题标题】:How to convert from record to tuple?如何从记录转换为元组?
【发布时间】:2018-11-09 21:59:40
【问题描述】:

我经常使用 CSV 类型提供程序,它为所有基础数​​据使用元组。我的问题是我遇到了包含大量列的 csv 文件,并发现围绕操作该大小的数据构建基础设施相当麻烦。如何构建一个只更新特定列子集的函数,而无需创建巨大的模式匹配语句?请参阅下面的代码示例。

// I want to generate lots of sample data for the first three columns
// And I would like to avoid creating giant record types in order to
// do this task as the csv's are always changing and the records would
// have to change as well
type CumbersomeCSVRow = // 17 fields now, but imagine 212
    string * string * string * Option<int> * string * 
    Option<int> * string * string * string * string * 
    string * string * Option<float> * string * 
    Option<float> * Option<float> * string

// Here is a sample row of data
let sampleCumbersomeRow : CumbersomeCSVRow = 
    ("First","Second","Third",Some(52),"MSCI",None,"B74A123","",
     "Airlines","Transportation","","",Some(1.04293),"Updated",
     Some(0.95),Some(56.7423),"Measured")

// Record type of the sample data that I want to 'insert' into the cumbersome data type
type FirstThreeStrings = 
    { First : string; Second : string; Third : string}

// and some instances of the new data
let generatedFrontMatters = 
    // imagine lots of sample data and workflows to create it, hence the records
    seq { for letter in ["A";"B";"C"] -> 
            { First  = letter;
              Second = letter + letter
              Third  = letter + letter + letter } }

【问题讨论】:

    标签: f# type-providers


    【解决方案1】:

    看看FSharp.Reflection 模块

    // Your Code --------------------------------------------------
    
    // I want to generate lots of sample data for the first three columns
    // And I would like to avoid creating giant record types in order to
    // do this task as the csv's are always changing and the records would
    // have to change as well
    type CumbersomeCSVRow = // 17 fields now, but imagine 212
        string * string * string * Option<int> * string * 
        Option<int> * string * string * string * string * 
        string * string * Option<float> * string * 
        Option<float> * Option<float> * string
    
    // Here is a sample row of data
    let sampleCumbersomeRow : CumbersomeCSVRow = 
        ("First","Second","Third",Some(52),"MSCI",None,"B74A123","",
         "Airlines","Transportation","","",Some(1.04293),"Updated",
         Some(0.95),Some(56.7423),"Measured")
    
    // Record type of the sample data that I want to 'insert' into the cumbersome data type
    type FirstThreeStrings = 
        { First : string; Second : string; Third : string}
    
    // and some instances of the new data
    let generatedFrontMatters = 
        // imagine lots of sample data and workflows to create it, hence the records
        seq { for letter in ["A";"B";"C"] -> 
                { First  = letter;
                  Second = letter + letter
                  Third  = letter + letter + letter } }
    
    // Response ---------------------------------------------------
    
    open FSharp.Reflection
    
    // create a static back matter to append to
    // the slicing here is the part that will need to change as the data changes
    //      ++ maybe there's a better way to handle this part??
    let staticBackMatter = 
        sampleCumbersomeRow
        |> FSharpValue.GetTupleFields
        |> (fun x -> x.[3 .. 16])
    
    // cast the front matter using FSharp.Reflection
    let castedFrontMatters = Seq.map FSharpValue.GetRecordFields generatedFrontMatters
    
    // append the data arrays together, create a tuple using reflection, and downcast the result
    // to your type
    let generatedRows = 
        castedFrontMatters
        |> Seq.map (fun frontArray -> Array.append frontArray staticBackMatter)
        |> Seq.map (fun data -> FSharpValue.MakeTuple(data,typeof<CumbersomeCSVRow>) :?> CumbersomeCSVRow)
        |> Seq.toList
    

    这是否是正确的 F#,我不知道。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-25
      • 2016-06-08
      • 2018-05-29
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      • 2012-12-31
      • 2017-02-21
      相关资源
      最近更新 更多