Вот хвосто-рекурсивное решение, проходящее вместе оба списка и накапливающее «чанк».
let chunkByInterval list intervals compare =
let rec chunk list intervals acc =
match (acc, list, intervals) with
| (head::tail), (x::xs as xs'), (y::ys as ys') ->
if compare x y then
chunk xs ys' ((x::head)::tail)
else
chunk xs' ys ([]::acc)
| (_, xs, _) -> xs::acc
chunk list intervals [[]] |> List.filter (not << List.isEmpty) |> List.map List.rev |> List.rev
И использование:
chunkByInterval [5; 10; 15; 45; 50; 55] [10; 20; 50] (<=) //[[5; 10]; [15]; [45; 50]; [55]]
Небольшой недостаток что, поскольку мы накапливаем минусы, мы должны полностью изменить список в конце. Это также предполагает, что оба списка отсортированы, но зачастую быстрее сначала отсортировать их, чем выполнять поиск O (n ^ 2) или использовать поиск.
Для этого существует элегантное решение с выражениями последовательности та же проблема - определенно проще с пакетом Interactive Extensions.