как применить функцию к каждой группе? - PullRequest
0 голосов
/ 26 июня 2018

Мне нужно применить функцию к каждой группе, представленной в приведенном ниже коде (<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 голосов
/ 26 июня 2018

Вы не сказали, что должна делать функция 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 (например), тогда будет возвращено количество строк в каждой группе (как определено парой класса и комнаты).

Трудно дать более полезный ответ, не имея полностью воспроизводимого фрагмента кода, но, надеюсь, это поможет вам в правильном направлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...