Noções Básicas Sobre Erros de Restrição de Valor F #

Não entendo como a Restrição de Valor no F # funciona. Eu li a explicação nowiki assim como oDocumentação MSDN. O que eu não entendo é:

Por que, por exemplo, isso me dá um erro de restrição de valor (tirado deisto questão):

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

Mas isso não acontece:

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

Isso é generalizado tudo bem ...

let is_bigger a b = a < b

mas isso não é (é especificado como int):

let add a b = a + b

Por que funções com parâmetros implícitos geram Restrição de Valor:

isto:

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

vs isso:

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

(Lembre-se, se eu usar essa função em um fragmento de código, o erro de RV desaparecerá, mas a função será especificada para o tipo que eu usei, e eu quero que ela seja generalizada)

Como funciona?

(Estou usando o último F #, v1.9.6.16)

questionAnswers(3)

yourAnswerToTheQuestion