首页 > 其他 > 详细

F#中的隐式转换

时间:2015-11-24 14:25:06      阅读:255      评论:0      收藏:0      [点我收藏+]

我们知道隐式变换在可控情况下会使代码变得简洁。熟悉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#中为了保证类型安全,不推荐使用这种自定义隐式变换特性。

 参考:Type Constraints

F#中的隐式转换

原文:http://www.cnblogs.com/sjjsxl/p/4990778.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!