Итератор просто добавляет распространенный способ пробежаться через набор объектов. Одной из хороших функций является i.remove (), в котором можно удалить элементы из списка, которого Вы выполняете итерации. Если бы Вы просто попытались удалить объекты из списка обычно, то он имел бы странные эффекты или бросок и исключение.
интерфейс похож на контракт для всех вещей, которые реализуют его. Вы в основном говорите.. что-либо, что реализует итератор, как гарантируют, будет иметь эти методы, которые ведут себя тот же путь. Можно также использовать его для раздавания типов итератора, если это - все, с чем Вы заботитесь о контакте в Вашем коде. (Вы не могли бы заботиться, какой список это.. Вы просто хотите передать Итератор), Вы могли поместить все эти методы независимо в наборы, но Вы не гарантируете, что они ведут себя то же или что у них даже есть то же имя и подписи.
Я недостаточно проанализировал код, чтобы понять почему, но добавляю
member internal tree.SyncStep() : unit =
// ^^^^^^
, кажется, исправляет.
РЕДАКТИРОВАТЬ
См. также
Почему F # определяет этот тип?
Общие сведения об ошибках ограничения значений F #
Неизвестная необходимость в аннотации типа или приведении
Требуется опыт, чтобы получить очень глубокое понимание возможностей и ограничений алгоритма вывода типов F #. Но этот пример, похоже, относится к классу проблем, с которыми сталкиваются люди, когда делают очень сложные вещи. Для членов класса a должен быть любым конкретным типом, который использовал его первый сайт вызова)
Это может быть не совсем верно; Я не знаю его достаточно хорошо, чтобы описать алгоритм, я просто чувствую его. Вы всегда можете прочитать спецификацию языка.
Часто случается, что вы доходите до пункта 3 и заставляете логический вывод начать попытки одновременного решения / ограничения всех тел методов, когда на самом деле это не нужно, потому что, например, может быть какая-то функция имеет легкий бетон фиксированного типа. Как и SyncStep - это unit-> unit, но F # еще не знает об этом на шаге 3, так как подпись не была явной, она просто говорит: ok SyncStep имеет тип "unit -> 'a" для некоторого еще нерешенного типа' a, а затем теперь SyncStep излишне усложняет все решение, вводя ненужную переменную.
Я обнаружил, что это было первое предупреждение (Эта конструкция делает код менее универсальным, чем указано в аннотациях типа. Переменная типа 'a был ограничен типом' V ') был в последней строке тела UpdateRenditions при вызове docTree.Compare (). Теперь я знаю, что Compare () должно быть unit -> unit. Так как же я мог получать предупреждение об универсальности там ? Ах, хорошо, компилятор не знает, что тип возвращаемого значения - это единица измерения в этот момент, поэтому он должен учитывать, что что-то является общим, а это не так. Фактически, я мог бы добавить аннотацию возвращаемого типа в Compare вместо SyncStep - любой из них работает.
В любом случае, я очень многословен.