QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

F#中的静态 Duck Typing

  • 2009-06-15
  • 本文字数:1339 字

    阅读完需:约 4 分钟

Duck Typing 是动态语言的重要特性之一,据Wikipedia 中的定义,这个名称及概念由 James Whitcomb Riley 提出:

当一只鸟走路像鸭子,游泳像鸭子,叫起来也像鸭子,那么我们就认为它就是鸭子。

对于传统的静态类型的语言(如 C#或 Java),类型的判定会在编译期进行,如果一系列类型需要对外界释放出某种共同的行为,那么它们则必须符合一个共同的协议(如基类或接口)。在支持 Duck Typing 的语言(如 JavaScript 或 Python)中,对于某个对象成员的访问会在运行时进行检查,正所谓“延迟判定”。关于 Duck Typing 的优劣,动态检查和静态检查之间的讨论已经数不胜数。

如果在 C#等静态语言中希望实现 Duck Typing 一般都会借助反射或动态生成适配器的方式进行,而在C# 4.0 中甚至增加了 dynamic 关键字从语法层面实现了 Duck Typing。不过在 F#中实现了一种在编译期进行检查的 Duck Typing 特性。 Matthew Podwysocki 在他的文章中展示了这样一个例子:

复制代码
<span>let inline </span>flyAndWalk arg =
<span>let </span>flying = ( ^a : (<span>member </span>Fly : unit <span>-> </span>string) arg)
<span>let </span>walking = ( ^a : (<span>member </span>Walk : unit <span>-> </span>string) arg)
(flying, walking)
<span>type </span>Duck() =
<span>member </span>this.Swim() = <span>"paddling"
</span><span>member </span>this.Fly() = <span>"flapping"
</span><span>member </span>this.Walk() = <span>"waddling"
</span><span>type </span>Eagle() =
<span>member </span>this.Fly() = <span>"soaring"
</span><span>member </span>this.Walk() = <span>"creeping"
</span><span>let </span>(eFly, eWalk) = flyAndWalk (<span>new </span>Eagle())
<span>let </span>(dFly, dWalk) = flyAndWalk (<span>new </span>Duck())

在以上代码中,flyAndWalk 方法限制了 arg 参数所必须具备的条件:“拥有特定签名的 Fly 和 Walk 方法”,而编译器则会对 flyAndWalk 方法的使用进行校验。F#提供了 inline 关键字使一个函数在编译时内联至调用方,不过它也限制了此类方法被.NET 平台上的其他语言调用。此外,与“范型”在运行时生成新类型的方式有所不同,“^”符号表示在编译期对可变类型进行静态解析。有关 inline 和“^”符号的含义及作用, Michael Giagnocavo 文章对此有较为详细的解释及相关示例。

F#的强类型 Duck Typing 特性在编译期限制了可用类型的结构,在保证了类型安全的同时,避免使用特定的协议来强制约束不同的类型。在 OCaml、Scala 等语言中,类似的特性也被称作 Structure Typing。 Lmeyerov 认为

Duck typing 看上去包含了动态的含义,而 Structure subtyping 是 Ocaml 静态世界中的瑰宝。

laogao 也有类似的看法:

我觉得严格意义上我们不应该称其为 duck typing,而是用 structural typing,只是在跟别人解释的时候,也许可以说它类似动态语言如 Python、Ruby、Groovy 等中的 duck typing 的概念。“duck typing”这个概念还是留给动态语言吧,让它指代在运行期而非编译期对类型的判定,静态语言如 Scala,还是叫“structural typing”吧。

您会在什么情况下使用这个特性呢?F#作为集成至 VS 2010 中的一线语言,已经展现出越来越强的生命力,您准备好了吗?

2009-06-15 22:451509
用户头像

发布了 157 篇内容, 共 55.8 次阅读, 收获喜欢 6 次。

关注

评论

发布
暂无评论
发现更多内容

软件测试 | ECharts简介与安装

测吧(北京)科技有限公司

测试

软件测试 | python数据持久化技术

测吧(北京)科技有限公司

测试

博睿数据入选中国信通院《高质量数字化转型产品及服务全景图》

博睿数据

可观测性 智能运维 博睿数据 信通院 高质量发展

主题别名(Topic Alias)-MQTT 5.0新特性

EMQ映云科技

物联网 IoT mqtt 企业号 3 月 PK 榜 主题别名

4道数学题,求解极狐GitLab CI 流水线|第4题:合并列车

极狐GitLab

ci DevOps pipeline runner 合并列车

你知道目前master分支目前多大吗?

坚果

OpenHarmony

软件测试 | 后端web开发框架

测吧(北京)科技有限公司

测试

ChatGPT开放API,上来就干到最低价,可以人手一个ChatGPT了

引迈信息

低代码 快速开发 openai ChatGPT

2022 IoTDB Summit:IoTDB PMC侯昊男《Apache IoTDB首创时序顺乱序分离存储引擎 IoTLSM》

Apache IoTDB

数据库 IoTDB

Spring Boot是如何内嵌Tomcat的?原理剖析

做梦都在改BUG

Java tomcat Spring Boot

从ChatGPT的技术发展角度解析未来智能化的发展方向

加入高科技仿生人

人工智能 AI 低代码 智能化 ChatGPT

软件测试/测试开发 | 测试平台开发-前端开发之数据展示与分析

测试人

软件测试 自动化测试 测试开发 测试平台

软件测试 | Android与iOS在app测试时有什么区别?

测吧(北京)科技有限公司

测试

软件测试 | Spring Boot的RESTful设计与实现

测吧(北京)科技有限公司

测试

Atlassian Server用户新选择 | 数据中心产品是否适合您的企业(3)?

龙智—DevSecOps解决方案

Server Atlassian Jira 数据中心版

PHP中出现Cannot modify header information - headers already sent

ModStart

软件测试 | Java数据持久化技术

测吧(北京)科技有限公司

测试

一键接入 ChatGPT,让你的QQ群变得热闹起来

极客飞兔

人工智能 聊天机器人 openai ChatGPT

OpenHarmonyApp启动页后记

白晓明

云数据库 HarmonyOS OpenHarmony 云函数 AppGallery Connect

软件测试 | Spring Boot集成Swargger

测吧(北京)科技有限公司

测试

研讨会回顾 | Perforce版本控制工具Helix Core入华十年,携手龙智赋能企业大规模研发

龙智—DevSecOps解决方案

版本控制 数字资产 游戏开发 数字资产管理 芯片研发

Centos 环境搭建

流火

Linux centos Centos 7

软件测试 | 跨平台API对接

测吧(北京)科技有限公司

测试

4月 · CSM认证周末班【提前报名特惠】“全球金牌课程”CST导师亲授

ShineScrum

软件测试 | Spring Boot异常处理

测吧(北京)科技有限公司

测试

软件测试 | python跨平台API对接

测吧(北京)科技有限公司

测试

软件测试 | Vuetify框架

测吧(北京)科技有限公司

测试

软件测试 | 为什么使用Spring Boot

测吧(北京)科技有限公司

测试

十年业务开发总结,如何做好高效高质量的价值交付

阿里技术

质量保障 交付质量

瓴羊Quick BI提供移动端自助分析解决方案, 易于性高于 Fine BI、 Smart BI

流量猫猫头

大数据 数据分析

软件测试/测试开发 | 学做测试平台开发-Vuetify 框架

测试人

软件测试 测试开发 测试平台

F#中的静态Duck Typing_.NET_赵劼_InfoQ精选文章