F#通用编程 - 使用成员

All*_*lan 4 generics f# constraints

假设我有一系列支持给定成员函数的类型,如Property下面的成员:

type FooA = {...} with

    member this.Property = ...

type FooB = {...} with

    member this.Property = ...
Run Code Online (Sandbox Code Playgroud)

假设成员Property为上述每种类型返回一个整数.现在,我想编写一个可以执行以下操作的通用函数:

let sum (a: 'T) (b: 'U) = a.Property + b.Property
Run Code Online (Sandbox Code Playgroud)

我习惯用C++编写以下代码:

template<typename T, typename U>
int sum(T a, U b)
{
    return a.Property + b.Property;
}
Run Code Online (Sandbox Code Playgroud)

如何在F#中实现等效的实现?

kvb*_*kvb 7

可以在F#中执行此操作,但它不是惯用的:

let inline sum a b = (^T : (member Property : int) a) + (^U : (member Property : int) b)
Run Code Online (Sandbox Code Playgroud)

一般来说,.NET泛型与C++模板有很大不同,因此在尝试使用F#模拟C++之前,可能首先要了解它们的差异.一般的.NET哲学是操作由名义类型而不是结构类型定义.在您的示例中,您可以定义一个暴露Property属性的接口,您的两个类实现该属性,然后您的sum函数将接受该接口的实例.

有关F#泛型的更多信息,请参见http://msdn.microsoft.com/en-us/library/dd233215.aspx ; 有关.NET泛型与C++模板的简要比较,请参阅http://blogs.msdn.com/b/branbray/archive/2003/11/19/51023.aspx(或者当您使用Google".NET时出现的任何内容)泛型C++模板").