2014-09-22 81 views
13

实践中的区别是什么?为什么你会用另一个呢? 似乎这两种类型都将用于解决相同的问题。界面与功能记录

我的问题,如果只涉及功能的F#代码。对于暴露于外部团体的F#组件,我发现Component Design Guidelines建议在函数记录中更喜欢使用接口。

回答

17

从概念上讲,函数记录与接口非常相似,大多数时候,你可以使用它们来解决给定的问题(所以这是一个很好的&有效问题)。

如果你只看技术方面,那么最大的区别就是接口可以有通用的方法。这事不能使用记录来完成 - 例如,没有办法定义功能的简单的记录,将对应于以下内容:

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

然而,在实践中,我觉得更重要的区别是有关的互操作性和设计:

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

一般来说,我主要使用记录,当我需要保持一些状态,例如,递归处理某些数据结构,我需要with构造。对于公共API,我相信使用接口和简单的类比使用记录更好的抽象。