F#中的隐式转换

我们知道隐式变换在可控情况下会使代码变得简洁。熟悉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

时间: 2024-08-28 09:33:26

F#中的隐式转换的相关文章

JavaScript中关于隐式转换的一些总结

JavaScript运算符中的隐式转换规律:一.递增递减运算符(前置.后置)1.如果包含的是有效数字字符串或者是有效浮点数字符串,则会将字符串转换(Number())为数值,再进行加减操作,返回值的类型是:number类型.2.如果不包含有效数字字符串,则会将字符串的值转换为NaN,返回值的类型是:number类型.3.如果是boolean类型,则先会把true或者false转换为1或者0,再进行加减操作,返回值的类型是:number类型.4.如果是null类型,则先会把null转换为0,在进行

深入理解Scala中的隐式转换系统

博客核心内容: 1.Scala中的两种隐式转换机制以及隐式视图的定义方式 2.Scala中的隐式绑定可能所处的位置以及如何更好的使用隐式转换 3.Scala中的隐式转换相关操作规则 4.Scala中的隐式参数 5.Scala中的隐式类 6.Scala中的隐式对象 7.Scala中的两种隐式类型约束(结合Scala中的类型系统) 8.Predef类中的implicitly方法的用法介绍以及Ordering类型转化为Oredered类型的方式 1.Scala中的两种隐式转换机制以及隐式视图的定义方式

Scala 中的隐式转换 implicit

Scala语言中的隐式转换是一个十分强大的语言特性,主要可以起到两个作用: 一.自动进行某些数据类型的隐式转换 String类型是不能自动转换为Int类型的,所以当给一个Int类型的变量或常量赋予String类型的值时编译器将报错.所以,一下语句是错误的. val x: Int = "100" 如果需要将一个字符串类型的整形数值赋给Int,比如使用String.toInt方法,例如: v al x: Int = "100".toInt 如果想让字符串自动转换为整形,

MySQL性能优化:MySQL中的隐式转换造成的索引失效

数据库优化是一个任重而道远的任务,想要做优化必须深入理解数据库的各种特性.在开发过程中我们经常会遇到一些原因很简单但造成的后果却很严重的疑难杂症,这类问题往往还不容易定位,排查费时费力最后发现是一个很小的疏忽造成的,又或者是因为不了解某个技术特性产生的. 于数据库层面,最常见的恐怕就是索引失效了,且一开始因为数据量小还不易被发现.但随着业务的拓展数据量的提升,性能问题慢慢的就体现出来了,处理不及时还很容易造成雪球效应,最终导致数据库卡死甚至瘫痪.造成索引失效的原因可能有很多种,相关技术博客已经有

Mysql中的隐式转换

在mysql查询中,当查询条件左右两侧类型不匹配的时候会发生隐式转换,可能导致查询无法使用索引,下面分析两种隐式转换的情况看表结构phone为int类型,name为varchar类型 EXPLAIN select * from user where phone   = '2' EXPLAIN select * from user where phone   = 2 两种情况都可以用到索引,这次等号右侧是'2',注意带单引号哟,左侧的索引字段是int类型,因此也会发生隐式转换,但因为int类型的数

Scala入门到精通——第十九节 隐式转换与隐式参数(二)

作者:摇摆少年梦 配套视频地址:http://www.xuetuwuyou.com/course/12 本节主要内容 隐式参数中的隐式转换 函数中隐式参数使用概要 隐式转换问题梳理 1. 隐式参数中的隐式转换 前一讲中,我们提到函数中如果存在隐式参数,在使用该函数的时候如果不给定对应的参数,则编译器会自动帮我们搜索相应的隐式值,并将该隐式值作为函数的参数,这里面其实没有涉及到隐式转换,本节将演示如何利用隐式参数进行隐式转换,下面的代码给定的是一个普通的比较函数: object ImplicitP

Scala入门到精通——第十八节 隐式转换与隐式参数(一)

本节主要内容 隐式转换简介 隐式转换函数 隐式转换规则 隐式参数 1. 隐式转换简介 在scala语言当中,隐式转换是一项强大的程序语言功能,它不仅能够简化程序设计,也能够使程序具有很强的灵活性.要想更进一步地掌握scala语言,了解其隐式转换的作用与原理是很有必要的,否则很难得以应手地处理日常开发中的问题. 在scala语言中,隐式转换是无处不在的,只不过scala语言为我们隐藏了相应的细节,例如scala中的类继承层次结构中: 它们存在固有的隐式转换,不需要人工进行干预,例如Float在必要

第五篇:你“ 看不见 ” 的隐式转换

前言 对于隐式转换,想必你已经了解了算数转换中的“ 向上对齐 ”的概念:了解了赋值隐式转换的规律( 右值类型转换为左值类型 ).但C++中的隐式转换远不止这些,本文就将告诉你一些容易被忽略,但事实上发生了的隐式转换. 数组转换为指针 在许多情况下,数组都隐式转换为了指针.取数组元素的过程就是根据首元素和元素序号以及元素大小到指定位置取值:数组作为函数参数传递给函数的过程中也转换成了指向首元素的指针.当然,在一些其他的场合,隐式转换未必发生,比如sizeof( 数组 )就不会隐式转换为sizeof

Shell、Awk 中自动隐式类型转换的“坑”

1.问题: 在林林总总的编程语言里,弱类型的语言着实不少,一方面这种"动态类型"用起来很方便,而另一方面则"坑"你没商量~ 常见的 SQL.Shell.Awk 都会遇到各种暗藏的"隐式类型转换",下面就列举一些 shell.awk 里的自动隐式类型转换 case,防止掉坑. 注意 shell.awk 的变量为空 字符串.变量为空 未定义.初始值的隐式转换问题: # shell 下的字典排序比较 [email protected] 10:59:23