首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数子类型的隐式转换

函数子类型的隐式转换
EN

Software Engineering用户
提问于 2018-05-24 12:24:35
回答 1查看 101关注 0票数 0

带有矫顽力的语言(即隐式转换)允许表达类似的东西(不管任何语法):

代码语言:javascript
复制
f : int32 → int32 = λx.x+x
a : int16 = 42
b : int64 = f(a)

在代码中没有显式表示类型转换的地方。类型检查依赖于:int16 <: int32 <: int64。是否有一种可扩展到函数类型的子类型的编程语言?允许写:

代码语言:javascript
复制
g : int16 → int64 = f
EN

回答 1

Software Engineering用户

发布于 2018-05-24 12:59:54

你把矫顽力和亚型混为一谈。

  • 一些矫顽力像上铸是免费的,并与亚型连接。它们只在类型检查期间起作用,而且它们具有相同的运行时表示形式。例如,所有对象都可能具有相同的表示形式(指针)。例如,在Java中,方法Derived f(Base x)Base g(Derived x)的子类型,如果DerivedBase的子类型。
  • 其他强制转换是隐式转换,具有一定的运行时效果,例如将int转换为double。不仅您必须为此发出代码,而且类型可能有不同的表示形式(例如,字节对字)。如果需要更改数据,则两个函数的ABI不兼容。例如,在Java中,函数int f(double x)不是double g(int x)的子类型,因为函数签名是根本不同的--像int这样的原始类型不是具有任何子类型关系的对象,而是值类型。在某些情况下,fg可能是源代码兼容的:double y = f(42)也可以在Java中使用g。但根据调用函数的不同,调用站点将生成不同的代码。调用方而不是函数执行这些值的转换。C++模板有点不寻常,因为它们本质上执行类似宏的代码生成。因此,编写C++模板函数t是可能的,只要这些函数与源代码兼容,就可以处理fg。但就语言而言,t(f)t(g)调用完全不同的函数t<...>(...)
票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/371481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档