The problem is that .NET does not support static constraints. F # allows them to embed functions that are compiled into static methods, but cannot encode it into the standard .NET type. In your code, the generic type you want to create will have a type parameter with a static constraint that .NET cannot represent.
You can change your method to static and it will work fine:
type UsesNextable() = static member inline Next(nextable) = let v = next nextable v.ToString()
Your type can still be generic if you want, but you should avoid referencing the type parameter with a static constraint, for example, this will work:
type UsesNextable<'T>() = static member inline NextOf(n:'U) = let v = next n in v.ToString()
But not this:
type UsesNextable<'T>() = static member inline NextOf(n:'T) = let v = next n in v.ToString()
Solving the first problem, you will see that both error messages disappear because the second is connected to the first, where the type system cannot encode the restriction, but now it can figure it out. ^?155882 represents a static constraint type variable that the type system could not infer.
Please note that changing from 'T to ΛT does not change anything, in fact both refer to the same type variable, the only thing you have to use a hat when calling the method.
Finally, about what you cannot write:
let inline next v = ((Next or ^T) : (static member ( ++ ) : Next * ^T -> ^T) Next, v)
which is clearly a mistake, because F # can output it, but you cannot write it, which is incompatible. I already reported this a while ago, and they told me that they would fix it in the future.
There are many ways to get around this restriction by forcing F # to infer a type instead of writing it directly; here is one solution for the ruler:
let inline next v = ((^Next or ^T) : (static member ( ++ ) : ^Next * ^T -> ^T) Next, v)
It will generate a warning, but you can disable it with the nowarn directive or by adding a parameter to a function containing an instance of type Next .