Ограничение значения - было выведено, что значение имеет универсальный тип - PullRequest
0 голосов
/ 13 апреля 2019

Дайте следующее определение

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

Может кто-нибудь объяснить

  1. В чем суть проблемы
  2. Как добавление аннотации типа решает проблему

1 Ответ

2 голосов
/ 13 апреля 2019

Ключ в том, что значения не могут быть универсальными в F #.Когда вы частично применяете функцию , результатом является значение .

Чтобы сделать левую часть привязки (или назначения) функцией, вы должныопределить параметр на левой стороне.

Ошибка, которую вы получаете, является результатом того, что IEnumerable недостаточно конкретен, чтобы значение было полностью определено.Учитывая IEnumerable, вы не знаете, что перебираете, и поэтому компилятор не может определить правильный тип для значения.

Ответы на ваш вопрос следующие:

  1. Суть в том, что значение не может быть универсальным
  2. Добавление определения типа позволяет компиляторуЗнайте, что это не значение, а скорее функция или что-то, что может быть общим.

Вот соответствующие документы MSDN: https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2010/dd233183(v=vs.100)#value-restriction

...