码迷,mamicode.com
首页 > 其他好文 > 详细

F#中的隐式转换

时间:2015-11-24 14:26:15      阅读:182      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!