Я не понимаю, почему следующий код не компилируетсяFSharp: Определение типа с общим
module GenericsTest =
open System
type Dog = {
name:string
}
type Apple = {
size:int
}
let get<'a> (id:string) =
Activator.CreateInstance<'a>()
let creatorInferred getAsParam =
let apple = {
name = getAsParam "some-apple"
}
let dog = {
size = getAsParam "some-dog"
}
(apple, dog)
let creatorWithTypeAnnotation (getAsParam:string->'a) =
let apple = {
name = getAsParam "some-apple"
}
let dog = {
size = getAsParam "some-dog"
}
(apple, dog)
Если вы посмотрите на «творца ...» 2 функции - оба они дают ошибку компиляции ..
это выражение, как ожидается, иметь тип Int ... но здесь есть строка типа
Я могу видеть, что F # является infering типа возвращаемого метод getAsParam должен быть int, потому что он является первым, с которым он сталкивается. Однако почему он не решает использовать общий тип возврата?
Как вы можете видеть, я попытался использовать подпись функции в методе creatorWithTypeAnnotation, но это не влияет.
Я в тупике! Как заставить это признать, что функция getAsParam должна возвращать общий?
В основном, когда он видит первый («Яблоко»), тип-вывод специализируется на 'getAsParam' в' string -> Apple', поэтому, конечно, ваше второе его использование (для 'Dog') должно завершиться неудачей - вы даже можете увидеть это, если вы удалите часть с ошибкой - компилятор должен предупредить вас, что он ограничил '' a'' на 'Apple' - попробуйте подумать о том, как вы напишете функцию, возвращающую реальный * общий *' 'a 'без обмана (отражение, умолчания, ...) – Carsten
, но .. как заставить getAsParam иметь общий тип возврата? Примечание. Я могу сделать это, если один из моих аргументов для getAsParams - это «... но я не хочу этого делать –
вы можете * обмануть * свой путь в это, если вы используете интерфейс вместо функции для' getAsParam' – Carsten