Подтвердить что ты не робот

Интерфейс и запись функций

В чем разница на практике? Почему вы используете один над другим? Кажется, оба типа будут использоваться для решения тех же проблем.

Мой вопрос, если касается только функционального кода F #. Для компонентов F #, которые подвергаются внешним сторонам, я обнаружил, что Руководство по разработке компонентов предлагает предпочесть подход интерфейсов к записи функций.

4b9b3361

Ответ 1

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

Если вы посмотрите только на технические аспекты, то самое большое различие заключается в том, что интерфейсы могут иметь общие методы. Это то, что невозможно сделать с помощью записей - например, нет способа определить простую запись функций, которая соответствовала бы следующему:

type IFoo<'T> =
   abstract Bar<'R> : 'R -> 'T

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

  • Интерфейсы хорошо взаимодействуют с С# и другими компонентами .NET
    (Построение записи F # функций из С# было бы очень сложным и уродливым)
  • Интерфейсы выражают другое намерение - это интерфейс, который может быть удовлетворен и реализован.
    С другой стороны, записи представляют собой совокупности функций, которые создан.
  • Записи хороши, если вам нужно использовать конструкцию { oldValue with NewFunction = newFunction } для замены одной функции.

В общем, я в основном использую записи, когда мне нужно сохранить некоторое состояние во время, например. рекурсивная обработка некоторой структуры данных, и мне нужна конструкция with. Для публичного API я считаю, что использование интерфейсов и простых классов лучше абстракции, чем использование записей.