Как досрочно вернуться с итерации последовательности?

#f# #escaping #sequences #seq

#f# #Экранирование #последовательности #продолжение

Вопрос:

Задан предикат «p», который сообщает, достаточно ли хорошее решение. Функция затрат «f», которая сообщает, насколько хорошим является возможное решение, и функция, которая ищет «наилучшее» (т. е. наименее затратное) решение в последовательности возможных решений. Как выглядит идиоматический способ отменить вычисление — в случае, если предикат гарантирует, что текущее решение «достаточно хорошее».

т. е. что-то вроде этого:

 let search p f solutionSpace =
    solutionSpace |> Seq.map (fun x -> f x, x)
                  |> Seq.ignoreAllFollowingElementsWhenPredicateIsTrue (fun (c, s) -> p c)
                  |> Seq.minBy (fun (c, _) -> c)
  

Ответ №1:

Это вызывается Seq.takeWhile в F # (когда предикат возвращает false, остановите последовательность).

Пример использования:

 let search p f solutionSpace =
    solutionSpace |> Seq.map (fun x -> f x, x)
                  |> Seq.takeWhile (fun (c, s) -> not (p c))
                  |> Seq.minBy (fun (c, _) -> c)
  

Комментарии:

1. О … большое спасибо … я думаю, это было скрыто на виду.. Я должен больше спать 🙂