Я понимаю, что это старый вопрос, но следующие могут иметь отношение к тем, у кого есть аналогичный вопрос.
О конкретный вопрос здесь
Там уже существует функция, которая возвращает ложь, как только один элемент в последовательности является ложным: Seq.forAll
.
Так самый простой ответ на этот вопрос на самом деле:
let success = Seq.forAll evaluation myList
, который немного легче понять, чем TechNeilogy’s (rewritten) answer
let success = not (Seq.exists evaluation myList)
И в the accepted answer by Wesley Wiser и в этом ответе, функция evaluation
не оценивается по элементам после первого элемента, который оценивает сброс. Но, как правильно заметил Паскаль Куок, в the accepted answer все элементы оставшейся части списка по-прежнему повторяются, что бесполезно. Напротив, 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
Для решения этой проблемы вы также можете использовать Seq.exists и отрицать результат. – TechNeilogy
Или Seq.forall, что то же самое минус отрицание. (как упомянуто Juliet ниже) –
Если вы хотите исходный код F #, он является частью CTP. Источник не поставляется с VS, а только CTP. http://www.microsoft.com/downloads/en/details.aspx?FamilyID=f8c623ae-aef6-4a06-a185-05f59be47d67&displaylang=en – Brian