Передача универсальной функции в качестве параметра
В последнее время я пытался изучать F# и, исходя из объектно-ориентированного опыта, у меня есть небольшие проблемы с пониманием дженериков в этом одном случае.
Допустим, у меня есть следующие функции:
let genericFunction<'a> (x: 'a) =
()
let myFunction (fn: ('a -> unit)) =
fn 2
fn 2UL
let test =
myFunction genericFunction
Как разработчик C# я бы ожидал fn
быть универсальной функцией, которая может принимать любой аргумент. Но fn 2
Вызов ограничения общего параметра 'a
в int
и, следовательно, он не может быть вызван с uint64
,
Почему универсальный тип ограничен? Как реализовать это, не передавая две функции?
Компилятор предупреждает об ограничивающих и, наконец, ошибках:
source_file.fs(5,8): warning FS0064: This construct causes code to be less generic than indicated by the type annotations. The type variable 'a has been constrained to be type 'int'.
source_file.fs(6,8): error FS0001: This expression was expected to have type
int
but here has type
uint64
Вот ошибка: http://rextester.com/RRRWTR28520