diff --git a/src/fsharp/FSharp.Core/array.fs b/src/fsharp/FSharp.Core/array.fs index 87b4698484c9d594d813a9568eeaf08f2dfa4a59..90f9a7fd7be0781c0c94b16313540eeb01268dbf 100644 --- a/src/fsharp/FSharp.Core/array.fs +++ b/src/fsharp/FSharp.Core/array.fs @@ -111,7 +111,7 @@ namespace Microsoft.FSharp.Collections arr [] - let collect (mapping: 'T -> 'U[]) (array: 'T[]) : 'U[]= + let collect (mapping: 'T -> 'U[]) (array: 'T[]) : 'U[]= checkNonNull "array" array let len = array.Length let result = Microsoft.FSharp.Primitives.Basics.Array.zeroCreateUnchecked<'U[]> len @@ -362,11 +362,14 @@ namespace Microsoft.FSharp.Collections Microsoft.FSharp.Primitives.Basics.Array.mapFoldBack mapping array state [] - let exists (predicate: 'T -> bool) (array: 'T[]) = + let inline exists ([] predicate: 'T -> bool) (array: 'T[]) = checkNonNull "array" array - let len = array.Length - let rec loop i = i < len && (predicate array.[i] || loop (i+1)) - len > 0 && loop 0 + let mutable state = false + let mutable i = 0 + while not state && i < array.Length do + state <- predicate array.[i] + i <- i + 1 + state [] let inline contains value (array: 'T[]) = diff --git a/src/fsharp/FSharp.Core/array.fsi b/src/fsharp/FSharp.Core/array.fsi index d13be1d17cd206464417b10f143215d371c970f5..8846db0bf6d9b0652c814ca8bc1fe1f78b289fb6 100644 --- a/src/fsharp/FSharp.Core/array.fsi +++ b/src/fsharp/FSharp.Core/array.fsi @@ -769,7 +769,7 @@ module Array = /// Evaluates to false /// [] - val exists: predicate:('T -> bool) -> array:'T[] -> bool + val inline exists: predicate:('T -> bool) -> array:'T[] -> bool /// Tests if any pair of corresponding elements of the arrays satisfies the given predicate. ///