diff --git a/src/fsharp/FSharp.Core/list.fs b/src/fsharp/FSharp.Core/list.fs index fdda3f9fc7d..6b31ea2b0f8 100644 --- a/src/fsharp/FSharp.Core/list.fs +++ b/src/fsharp/FSharp.Core/list.fs @@ -212,11 +212,15 @@ namespace Microsoft.FSharp.Collections [] let fold<'T,'State> folder (state:'State) (list: 'T list) = - let f = OptimizedClosures.FSharpFunc<_,_,_>.Adapt(folder) - let mutable acc = state - for x in list do - acc <- f.Invoke(acc, x) - acc + match list with + | [] -> state + | _ -> + let f = OptimizedClosures.FSharpFunc<_,_,_>.Adapt(folder) + let rec loop s xs = + match xs with + | [] -> s + | h::t -> loop (f.Invoke(s,h)) t + loop state list [] let pairwise (list: 'T list) = @@ -352,10 +356,12 @@ namespace Microsoft.FSharp.Collections let exists predicate list = Microsoft.FSharp.Primitives.Basics.List.exists predicate list [] - let rec contains value source = - match source with - | [] -> false - | h::t -> if h = value then true else contains value t + let inline contains value source = + let rec contains e xs1 = + match xs1 with + | [] -> false + | h1::t1 -> e = h1 || contains e t1 + contains value source let rec exists2aux (f:OptimizedClosures.FSharpFunc<_,_,_>) list1 list2 = match list1,list2 with diff --git a/src/fsharp/FSharp.Core/list.fsi b/src/fsharp/FSharp.Core/list.fsi index 2cc18ac71e6..6ba6f988a2f 100644 --- a/src/fsharp/FSharp.Core/list.fsi +++ b/src/fsharp/FSharp.Core/list.fsi @@ -102,7 +102,7 @@ namespace Microsoft.FSharp.Collections /// The input list. /// True if the input list contains the specified element; false otherwise. [] - val contains: value:'T -> source:'T list -> bool when 'T : equality + val inline contains: value:'T -> source:'T list -> bool when 'T : equality /// Returns a list that contains no duplicate entries according to generic hash and /// equality comparisons on the entries.