Ответ 1
Понятно, что записи функций очень похожи на интерфейсы и большую часть времени, вы можете использовать их оба для решения данной проблемы (так что это большой и правильный вопрос).
Если вы посмотрите только на технические аспекты, то самое большое различие заключается в том, что интерфейсы могут иметь общие методы. Это то, что невозможно сделать с помощью записей - например, нет способа определить простую запись функций, которая соответствовала бы следующему:
type IFoo<'T> =
abstract Bar<'R> : 'R -> 'T
Однако на практике я думаю, что более важные различия связаны с функциональной совместимостью и дизайном:
- Интерфейсы хорошо взаимодействуют с С# и другими компонентами .NET
(Построение записи F # функций из С# было бы очень сложным и уродливым) - Интерфейсы выражают другое намерение - это интерфейс, который может быть удовлетворен и реализован.
С другой стороны, записи представляют собой совокупности функций, которые создан. - Записи хороши, если вам нужно использовать конструкцию
{ oldValue with NewFunction = newFunction }
для замены одной функции.
В общем, я в основном использую записи, когда мне нужно сохранить некоторое состояние во время, например. рекурсивная обработка некоторой структуры данных, и мне нужна конструкция with
. Для публичного API я считаю, что использование интерфейсов и простых классов лучше абстракции, чем использование записей.