【AICon】探索八个行业创新案例,教你在教育、金融、医疗、法律等领域实践大模型技术! >>> 了解详情
写点什么

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:451357
用户头像

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

关注

评论

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

Vue 中 $attrs 与 $listeners 的详解

编程江湖

Vue 大前端

前端开发中需要掌握的开发框架React

@零度

大前端 React

2022第十五届北京国际智慧工地展览会

InfoQ_caf7dbb9aa8a

Rust 元宇宙 8—— 脚本

Miracle

rust 脚本 元宇宙

大厂算法面试之leetcode精讲11剪枝&回溯

全栈潇晨

LeetCode 算法面试

建立合格的跨职能团队,你需要知道这些!

禅道项目管理

团队 合作共赢

【IT运维小知识】虚拟化vCenter是什么意思?有啥优势?

行云管家

【最全攻略】玩转2021LIGHT开发者云大会

恒生LIGHT云社区

技术 开发 行业 行业大会

2022北京智博会AIOTE 第十五届(北京)国际智慧城市、物联网、大数据博览会

InfoQ_caf7dbb9aa8a

大厂算法面试之leetcode精讲12.堆

全栈潇晨

算法 LeetCode

你有一份「写作跨年」邀请函请查收 | 28天写作计划

TGO鲲鹏会

写作 技术创作 28天写作 内容创作 热门活动

2022北京智博会AIOTE 2022第十五届北京国际AI人工智能产品展览会

InfoQ_caf7dbb9aa8a

Linux学习指南《Linux一学就会》带你玩转Linux

侠盗安全

Linux linux运维 运维工程师 云计算架构师

2022第十五届北京国际大数据产业博览会

InfoQ_caf7dbb9aa8a

2022第十五届北京国际AI人工智能产品展览会

InfoQ_caf7dbb9aa8a

混合云管理软件用哪个品牌好?咨询电话多少?

行云管家

新思科技BSIMM12报告显示开源、云、容器安全活动增长显著

InfoQ_434670063458

新思科技 软件安全 BSIMM

文本分类:Keras+RNN vs 传统机器学习

华为云开发者联盟

机器学习 深度学习 keras RNN 文本分类

详解预训练模型在信息检索第一阶段的应用

百度Geek说

后端 预训练 信息检索

技术分享| Sip与WebRTC互通-SRProxy开源库讲解

anyRTC开发者

音视频 WebRTC SIP 视频会议 SRProxy

数据分析从零开始实战,Python、Pandas与各类数据库

老表

Python 数据库 数据分析 pandas 11月日更

大数据开发hadoop入门基础之sqoop

@零度

大数据 hadoop sqoop

dart系列之:数学什么的就是小意思,看我dart如何玩转它

程序那些事

flutter dart 程序那些事 11月日更

react源码解析6.legacy模式和concurrent模式

buchila11

React React Hooks

2022北京智博会AIOTE 2022第十五届北京国际人工智能产品展览会

InfoQ_caf7dbb9aa8a

2022北京智博会AIOTE 第十五届(北京)国际智慧城市、物联网、大数据博览会

InfoQ_caf7dbb9aa8a

Nocalhost 为 KubeSphere 提供更强大的云原生开发环境

CODING DevOps

Kubernetes DevOps 云原生 集群 Nocalhost

恒源云(GPUSHARE)_云GPU服务器如何登陆Windows实例?

恒源云

人工智能 深度学习 算力

开发好能重构的代码,都是这么干的

华为云开发者联盟

接口 重构 代码 并发 注释

react源码解析5.jsx&核心api

buchila11

React React Hooks

Linux一学就会之Vim编辑器的使用和Xmanager工具的使用。

学神来啦

vim Linux centos 运维 ext4

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