Short answer: no, since the value will be inserted into the queue on the call site, it will not be able to use private values, and there is no real way to get around it.
The longer answer is: if you don't mind writing incredibly ugly code, and you can handle the overhead of several method calls per use, one alternative is to create dynamic implementations (like OperatorIntrinsics.AbsDynamicTableImpl in the main library) that may be private. You can then wrap the dynamic implementation with a publicly opaque universal method (e.g. OperatorIntrinsics.AbsDynamic<'T> ), and then create an inline value that adds the correct type constraints and discards the dynamic implementation (e.g. let inline abs< ^t when ^t : (static member Abs : ^t -> ^t)> x = AbsDynamic x ). Now that you are inline abs , you just see the AbsDynamic call, but not one of the further implementation details. In most cases, I would expect it to be much worse than just making your value public, not private.
source share