Как рано вернуться с итерации последовательности? - PullRequest
4 голосов
/ 13 апреля 2011

Учитывая предикат "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 Ответ

5 голосов
/ 13 апреля 2011

Это называется 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)
...