我们知道隐式变换在可控情况下会使代码变得简洁。熟悉C#的都知道C#中可以自定义隐式变换,例如
public class A { private int data; public static implicit operator A(int i) { return new A{ data = i}; } }
众所周知,F#本身不会进行任何隐式变换。那F#中是否也可以自定义隐式变换呢?
当然可以。通过定义自己的操作符即可实现。
我们先定义一个转换操作符
let inline (!>) (x:^a) : ^b = ((^a or ^b) : (static member op_Implicit : ^a -> ^b) x)
先看操作符"!>"的签名:有一个类型为a的输入参数,输出参数类型为b。再看定义部分,则是一个类型约束,指示类型a或者b至少有一个类型包含指定签名的成员
static member op_Implicit。然后接着是输入参数x。这些,就足够实现隐式转换。看一个例子
let inline (!>) (x:^a) : ^b = ((^a or ^b) : (static member op_Implicit : ^a -> ^b) x) type A() = class end type B() = static member op_Implicit(a:A) = B() member this.Add x y = x + y let show (b: B) = b.Add let res = show (!> A()) 1 2
这段代码输入结果为3。
当然,在F#中为了保证类型安全,不推荐使用这种自定义隐式变换特性。
原文:http://www.cnblogs.com/sjjsxl/p/4990778.html