I don't understand how the Value Restriction in F# works. I've read the explanation in the [wiki](http://www.strangelights.com/fsharp/wiki/default.aspx/FSharpWiki/ValueRestriction.html) as well as the [MSDN documentation](http://msdn.microsoft.com/en-us/library/dd233183(VS.100).aspx). What I don't understand is: 

1. Why, for example, this gives me a Value Restriction error (Taken from [this](https://stackoverflow.com/questions/416508/f-compiler-error-fs0030-problems-with-the-value-restriction) question):

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

```

But ths doesn't:

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

```
2. This is generalized all right...

```
let is_bigger a b = a < b

```

but this isn't (it is specified as int):

```
let add a b = a + b

```
3. Why functions with implicit parameters generate Value Restriction:

this:

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

```

vs this:

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

```

(Mind you, if I do use this function in a code fragment the VR error will be gone, but then the function will be specified to the type I used it for, and I want it to be generalized)

How does it work?

(I'm using the latest F#, v1.9.6.16)