接口与功能记录

Art*_*ski 18 f#

练习有什么区别?你为什么要用另一个呢?看起来这两种类型都可以用来解决同样的问题.

我的问题是只有功能性的F#代码.对于暴露给外部各方的F#组件,我发现 组件设计指南建议优先使用接口方法而不是功能记录.

Tom*_*cek 23

从概念上讲,函数记录与接口非常相似,大多数情况下,您可以使用它们来解决给定的问题(因此这是一个非常有效的问题).

如果你只看技术方面,那么最大的区别是接口可以有通用的方法.这是使用记录无法完成的事情 - 例如,无法定义与以下内容对应的简单函数记录:

type IFoo<'T> =
   abstract Bar<'R> : 'R -> 'T
Run Code Online (Sandbox Code Playgroud)

但是,在实践中,我认为更重要的差异与互操作性和设计有关:

  • 接口与C#和其他.NET组件很好地互操作
    (从C#构建F#函数记录将非常困难和丑陋)
  • 接口表达了不同的意图 - 它们是可以满足和实现的接口.
    另一方面,记录是创建的函数的集合 .
  • 如果您需要使用{ oldValue with NewFunction = newFunction }构造来替换一个函数,则记录很好.

一般来说,当我需要在某些数据结构的递归处理期间保持某些状态时,我主要使用记录,并且我需要with构造.对于公共API,我认为使用接口和简单类比使用记录更好的抽象.