Я понимаю, что это старый вопрос, но следующее может относиться к тем, у кого похожий вопрос.
О конкретном вопросе здесь
Тамуже существует функция, которая возвращает false, как только один элемент в последовательности является ложным: Seq.forAll
.
Таким образом, на самом деле самый простой ответ на вопрос:
let success = Seq.forAll evaluation myList
, чтонемного легче понять, чем (переписанный) ответ TechNeilogy
let success = not (Seq.exists evaluation myList)
Оба в принятый ответ Уэсли Вайзера , и в этом ответе функция evaluation
не оценивается на предметах после первого предмета, который оценивает сложение.Но, как правильно заметил Паскаль Куок, в принятом ответе все элементы остальной части списка все еще повторяются, что бесполезно.Напротив, Seq.forAll
действительно прекращает итерации, когда нет смысла продолжать.То же самое можно сказать и о Seq.exists
, Seq.takeWhile
,…
о коротком замыкании сгиба в целом
В других случаях требуется короткое замыкание сгиба,Это может быть сделано.
Шаг 1: Определите папку с некоторой индикацией того, что состояние не изменится во время обхода остальной части исходной последовательности, и свертывание должно бытькороткое замыкание.
Шаг 2: Используйте Seq.scan
вместо fold
.Seq.scan
аналогично fold
, принимает те же аргументы, но вычисляет по требованию и возвращает не только конечное состояние, но и последовательность всех промежуточных состояний и конечное состояние.Отсюда следует: Seq.last (Seq.scan folder initialState mySequence) = Seq.fold folder initialState mySequence
Шаг 3: Используйте функцию короткого замыкания на выходе Seq.scan
.Выберите: Seq.takeWhile
, Seq.forall
, Seq.exists
,…
В следующем примере состояние становится None
при обнаружении дублирующего элемента, что означает, что сканирование может быть коротким.
let allDistinct mySequence =
let folder state element =
match state with
| Some elementsSoFar when not (Set.contains element elementsSoFar) ->
Some (Set.add element elementsSoFar)
| _ ->
None
let initialState = Some Set.empty
let scanning = Seq.scan folder initialState mySequence
Seq.forall Option.isSome scanning