如何对每个组应用功能?

时间:2018-06-26 19:59:48

标签: f#

我需要在下面的代码中将函数应用于由(<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 个答案:

答案 0 :(得分:4)

您没有说出func函数应该做什么,但是从收到的错误来看,它似乎产生了RoomAssignment个值的列表。如果要收集结果并为每个组获取一个结果,则可能需要map而不是iter

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

例如,如果将func替换为Seq.length,则将返回每个组中的行数(由一对班级和房间定义)。

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