Дайте следующее определение
let fn (id: int) (_:string) = id
Я могу создать частично примененную функцию
let fnPartial = fn 1
Однако, изменив тип _
на незапечатанный тип, такой как IEnumerable
let fn (id: int) (_:IEnumerable) = id
Вызывает ошибку компиляции
Ограничение значения.Значение 'fnPartial' было выведено, чтобы иметь универсальный тип val fnPartial: ('_a -> int), когда' _a:> IEnumerable Либо сделать аргументы для 'fnPartial' явными, либо, если вы не намереваетесь сделать его универсальным,добавить аннотацию типа.(с использованием встроенного компилятора F #)
Ошибка была поднята , но закрыта со следующим ответом
Да, это специально - IEnumerable являетсяне запечатан там, где находится строка, и это вызывает ограничение значения для срабатывания
Обходной путь - добавить аннотацию типа
let fn (id: int) (_:IEnumerable ) = id
let fnPartial<'a> = fn 1
Может кто-нибудь объяснить
- В чем суть проблемы
- Как добавление аннотации типа решает проблему