From 56e45e16a2f86c4aa5fe23b878742e4176f0cf19 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Wed, 23 May 2018 08:13:36 +0200 Subject: [PATCH 1/2] remove a setify --- src/fsharp/TypeChecker.fs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index c3f4412a20d..b94f2259bfe 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -10013,8 +10013,12 @@ and TcMethodArg cenv env (lambdaPropagationInfo, tpenv) (lambdaPropagationInfo let rec loop callerLambdaTy lambdaVarNum = if lambdaVarNum < numLambdaVars then let col = [ for row in prefixOfLambdaArgsForEachOverload -> row.[lambdaVarNum] ] - // Check if all the rows give the same argument type - if col |> ListSet.setify (typeEquiv cenv.g) |> isSingleton then + let allRowsGiveSameArgumentType = + match col with + | [] -> false + | x::rest -> rest |> List.forall (typeEquiv cenv.g x) + + if allRowsGiveSameArgumentType then let calledLambdaArgTy = col.[0] // Force the caller to be a function type. match UnifyFunctionTypeUndoIfFailed cenv env.DisplayEnv mArg callerLambdaTy with From cb51fb41775cca6e550c0a3d31441a7e2bff0576 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Wed, 23 May 2018 08:21:38 +0200 Subject: [PATCH 2/2] Remove intermediate collection --- src/fsharp/TypeChecker.fs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index b94f2259bfe..e071ac09073 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -10012,15 +10012,13 @@ and TcMethodArg cenv env (lambdaPropagationInfo, tpenv) (lambdaPropagationInfo // The loop variable callerLambdaTyOpt becomes None if something failed. let rec loop callerLambdaTy lambdaVarNum = if lambdaVarNum < numLambdaVars then - let col = [ for row in prefixOfLambdaArgsForEachOverload -> row.[lambdaVarNum] ] + let calledLambdaArgTy = prefixOfLambdaArgsForEachOverload.[0].[lambdaVarNum] let allRowsGiveSameArgumentType = - match col with - | [] -> false - | x::rest -> rest |> List.forall (typeEquiv cenv.g x) + prefixOfLambdaArgsForEachOverload + |> Array.forall (fun row -> typeEquiv cenv.g calledLambdaArgTy row.[lambdaVarNum]) if allRowsGiveSameArgumentType then - let calledLambdaArgTy = col.[0] - // Force the caller to be a function type. + // Force the caller to be a function type. match UnifyFunctionTypeUndoIfFailed cenv env.DisplayEnv mArg callerLambdaTy with | Some (callerLambdaDomainTy, callerLambdaRangeTy) -> if AddCxTypeEqualsTypeUndoIfFailed env.DisplayEnv cenv.css mArg calledLambdaArgTy callerLambdaDomainTy then