Я не понимаю, как работает Value Restriction в F #. Я прочитал объяснение в wiki, а также Документация MSDN. Я не понимаю, что:
-
Почему, например, это дает мне ошибку с ограничением значения (взято из этого вопроса):
let toleq (e:float<_>) a b = (abs ( a - b ) ) < e
Но ths не делает:
let toleq e (a:float<_>) b = (abs ( a - b ) ) < e
-
Это обобщается правильно...
let is_bigger a b = a < b
но это не так (это указано как int):
let add a b = a + b
-
Почему функции с неявными параметрами генерируют ограничение значения:
let item_count = List.fold (fun acc _ -> 1 + acc) 0
vs this:
let item_count l = List.fold (fun acc _ -> 1 + acc) 0 l
(Имейте в виду, что если я использую эту функцию в фрагменте кода, ошибка VR исчезнет, но тогда функция будет указана для типа, в котором я его использовал, и я хочу, чтобы она была обобщена)
Как это работает?
(Я использую последние F #, v1.9.6.16)