Принуждение вывода типа F# на дженериках и интерфейсах для пребывания свободным

Итератор просто добавляет распространенный способ пробежаться через набор объектов. Одной из хороших функций является i.remove (), в котором можно удалить элементы из списка, которого Вы выполняете итерации. Если бы Вы просто попытались удалить объекты из списка обычно, то он имел бы странные эффекты или бросок и исключение.

интерфейс похож на контракт для всех вещей, которые реализуют его. Вы в основном говорите.. что-либо, что реализует итератор, как гарантируют, будет иметь эти методы, которые ведут себя тот же путь. Можно также использовать его для раздавания типов итератора, если это - все, с чем Вы заботитесь о контакте в Вашем коде. (Вы не могли бы заботиться, какой список это.. Вы просто хотите передать Итератор), Вы могли поместить все эти методы независимо в наборы, но Вы не гарантируете, что они ведут себя то же или что у них даже есть то же имя и подписи.

11
задан Dan Fitch 27 November 2009 в 15:40
поделиться

1 ответ

Я недостаточно проанализировал код, чтобы понять почему, но добавляю

  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 - любой из них работает.

    В любом случае, я очень многословен.

    17
    ответ дан 3 December 2019 в 05:58
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: