Как решить, это простая часть, сделать findq0
универсальную функцию :
let findq0 x = queue_it _find x // int -> 'a
Разница с тем, что у вас было, в том, что в вашей версии
let findq0 = queue_it _find // int -> User
findq0
является родовым значением , что является проблемой для .Net, которая обычно приводит к сообщению об ошибке, подобному этому
Ограничение значения.Значение 'findq0' было выведено, чтобы иметь универсальный тип val findq0: (int -> '_a), когда' _a:> Answer.foo.MBase Либо сделать аргументы для 'findq0' явными, либо, если вы не собираетесь использовать егочтобы быть общим, добавьте аннотацию типа.
Вы можете увидеть сообщение, если закомментируете последние 2 строки своего кода.F # пытается избежать этого сообщения, угадывая неуниверсальное значение, основанное на вашем первом использовании findq0
, а именно:
let u3 : User = findq0 42
Эта строка говорит F #, что findq0
должно возвращать значение типа User
и поэтому он определяет, что он должен иметь тип int -> User
.Следующая строка противоречит этому, и вы получите сообщение об ошибке:
Ожидается, что это выражение будет иметь тип 'User2', но здесь имеет тип 'User'