Entendiendo los errores de restricción de valor de F #

No entiendo cómo funciona la restricción de valor en F #. He leído la explicación en elwiki así como elDocumentación de MSDN. Lo que no entiendo es:

Por ejemplo, esto me da un error de restricción de valor (tomado deesta pregunta):

let toleq (e:float<_>) a b = (abs ( a - b ) ) < e

Pero esto no:

let toleq e (a:float<_>) b = (abs ( a - b ) ) < e

Esto está generalizado de acuerdo ...

let is_bigger a b = a < b

pero esto no es (se especifica como int):

let add a b = a + b

Por qué las funciones con parámetros implícitos generan una restricción de valor:

esta:

let item_count = List.fold (fun acc _ -> 1 + acc) 0

vs esto:

let item_count l = List.fold (fun acc _ -> 1 + acc) 0 l

(Tenga en cuenta que si utilizo esta función en un fragmento de código, el error de VR desaparecerá, pero luego la función se especificará para el tipo para el que la usé, y quiero que se generalice)

¿Como funciona?

(Estoy usando el último F #, v1.9.6.16)

Respuestas a la pregunta(3)

Su respuesta a la pregunta