open Microsoft.FSharp.Linq.RuntimeHelpers open System open System.Linq.Expressions //F#-helper method for Linq.Expressions: fssnip.net/ts/title/F-lambda-to-C-LINQ-Expression module Lambda = let toExpression (``f# lambda`` : Quotations.Expr<'a>) = ``f# lambda`` |> LeafExpressionConverter.QuotationToExpression |> unbox> let toTraverse = <@ Func(fun i -> i + 1) @> |> Lambda.toExpression // val toTraverse : Expression> = i => (i + 1) let toInject = <@ Func(fun j -> j * 2) @> |> Lambda.toExpression // val toInject : Expression> = j => (j * 2) let visitor = { new ExpressionVisitor() with member __.VisitParameter _ = toInject.Body member __.VisitLambda x = let visitedBody = base.Visit x.Body Expression.Lambda(visitedBody, toInject.Parameters) :> Expression } let visited = visitor.Visit toTraverse // val visited : Expression = j => ((j * 2) + 1) //let f = Expression.Lambda(visited).Compile().DynamicInvoke() |> unbox> //f.Invoke(5) // val it : int = 11