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