代码之家  ›  专栏  ›  技术社区  ›  SantiClaus

如何将函数应用于每个组?

f#
  •  -1
  • SantiClaus  · 技术社区  · 8 年前

    我需要将一个函数应用于由 (<seq>) 在下面的代码中,但是函数会将每个组视为新数据。因此,函数在遍历每个组后重置,然后输出新转换的组。

    let datafilter =
            datacsv
            |> List.groupBy (fun row -> row.Class,row.Room)
            |> List.iter (fun ((class,room),rows) -> func rows )
    
    (* Outputs [((112, 1), <seq>); ((113, 2), <seq>); ((114, 3), <seq>);
           ((115, 4), <seq>); ((116, 5), <seq>); ((117, 6), <seq>);
           ((118, 7), <seq>); ((119, 8), <seq>); ((120, 9), <seq>);
           ((121, 10), <seq>); ((122, 11), <seq>); ((123, 12), <seq>)]  *)
    
    type RoomAssignment = 
        { Class : int
          Room : int
          Date : DateTime
          People : int }
    

    func 是一个随机函数。运行代码时出现错误结果:

    TermStructure.fsx(96,46): error FS0001: This expression was expected to have type
        'unit'    
    but here has type
        'RoomAssignment list'
    
    1 回复  |  直到 8 年前
        1
  •  4
  •   Tomas Petricek    8 年前

    你没说什么 func 函数应该正在执行,但从您得到的错误来看,它似乎生成了一个 RoomAssignment 价值观。如果您想要收集结果,并且每个组有一个结果,那么您可能需要 map 而不是 iter 以下内容:

    let datafilter =
      datacsv
      |> List.groupBy (fun row -> row.Class, row.Room)
      |> List.map (fun ((class,room),rows) -> func rows)
    

    如果你替换 功能 具有 Seq.length (例如),然后返回每个组中的行数(由一对类和房间定义)。

    如果没有完整的可复制代码片段,很难给出一个更有用的答案,但希望这将指导您走向正确的方向。