Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么Scala要求函数具有显式的返回类型?

为什么Scala要求函数具有显式的返回类型?
EN

Software Engineering用户
提问于 2012-10-02 19:15:22
回答 1查看 6K关注 0票数 12

我最近开始学习用Scala编程,到目前为止一直很有趣。我真的很喜欢在另一个函数中声明函数的能力,这似乎是直觉所要做的事情。

我对Scala的一个恼怒是,Scala在其函数中需要显式的返回类型。我觉得这阻碍了语言的表达。而且,很难用这个需求来编程。也许是因为我来自Javascript和Ruby舒适区。但是对于像Scala这样的语言,它将在一个应用程序中包含大量的连接函数,我无法想象我如何在头脑中头脑风暴,我所编写的特定函数应该在递归之后返回什么类型的递归。

这种对函数的显式返回类型声明的要求,不需要像Java和C++这样的语言来困扰我。Java和C++中的递归,当它们确实发生时,通常最多处理2到3个函数。从未有几个函数像Scala那样链接在一起。

所以我想我想知道为什么Scala应该要求函数具有显式返回类型,这是否有一个很好的理由?

EN

回答 1

Software Engineering用户

回答已采纳

发布于 2012-10-02 19:52:19

Scala不需要所有函数的显式返回类型,只需要递归函数。原因是Scala的类型推断算法(接近)是一种从头到尾的简单扫描,无法向前看。

这意味着像这样的函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def fortuneCookieJoke(message: String) = message + " in bed."

不需要返回类型,因为Scala编译器可以清楚地看到返回类型必须是String,而无需使用逻辑变量或查看方法参数以外的任何内容。

另一方面,像这样的函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def mapInts(f: (Int) => Int, l: List[Int]) = l match {
  case Nil => Nil
  case x :: xs => f(x) :: mapInts(f, xs)
}

将导致编译时错误,因为Scala编译器如果不使用前瞻性或逻辑变量,就无法看到mapInts的确切类型。如果它足够聪明的话,它可以说的最多的是返回类型是List[Nothing]的超级类型,因为Nil是该类型的。这并不能提供足够的信息来准确地确定mapInts的返回类型。

请注意,这是Scala特有的,还有其他静态类型化语言(大多数Miranda/Haskell/Clean族、大多数ML家族和少数分散的其他语言),它们使用比Scala使用的更全面和更有能力的类型推理算法。另外,请注意,这并不完全是Scala的错;标称子类型和全模块类型推断根本上是不一致的,Scala的设计者为了Java兼容性的考虑,选择了前者而不是后者,而“更纯”静态类型化的功能语言大多是在设计时考虑了相反的选择。

票数 17
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章
C++17中具有显式对齐的分配函数:入门指南
在C++ 发展的历程中,C++17 带来了诸多令人瞩目的特性,其中对内存对齐实现更细粒度的控制,无疑是一大亮点。这一特性为程序员在管理内存分配时提供了更高的灵活性与效率,尤其在高性能计算、嵌入式系统开发以及其他对特定对齐有要求的复杂场景中,作用显著。接下来,我们将深入探讨 C++17 中具有显式对齐的分配函数,全面了解其语法规则、使用技巧以及实际应用场景。
码事漫谈
2025/02/04
1060
C++17中具有显式对齐的分配函数:入门指南
Scala教程之:函数式的Scala
高阶函数通常来讲就是函数的函数,也就是说函数的输出参数是函数或者函数的返回结果是函数。在Scala中函数是一等公民。
程序那些事
2020/07/07
7930
【Kotlin】函数 ③ ( 匿名函数 | 匿名函数的函数类型 | 匿名函数的隐式返回 )
Kotlin 中对 CharSequence 类进行了扩展 , 定义了 count(predicate: (Char) -> Boolean) 扩展函数 , 接收一个 (Char) -> Boolean 类型的函数 , 用于 返回匹配给定 匿名函数 的字符数 ;
韩曙亮
2023/03/30
3.1K0
【Kotlin】函数 ③ ( 匿名函数 | 匿名函数的函数类型 | 匿名函数的隐式返回 )
Scala 函数响应式编程: 静态类型 (Static Types)
2016.12.3,  北京, Ken Fang 函数响应式编程为使函数内的代码更加的强壮, 便需在代码编译的阶段时, 就要能确定传入函数的参数类型, 是符合领域模型中的商业规则。也就是说, 藉由编译
Ken Fang 方俊贤
2018/01/05
6680
函数式编程与面向对象编程[4]:Scala的类型关联Type Alias函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
scala里的类型,除了在定义class,trait,object时会产生类型,还可以通过type关键字来声明类型。
一个会写诗的程序员
2018/08/20
7720
Scala专题系列(九) : Scala函数式编程
普通一个函数是输入一个参数输出一个返回值,而带有副作用的函数不仅仅返回一个值,还带有其它的操作:
用户5252199
2022/04/18
3950
C++中的显式类型转化
该文摘要总结:利用C++的static_cast, const_cast, reinterpret_cast, 以及dynamic_cast进行类型转换。static_cast简单而实用,适合大多数情况。const_cast用于去除对象的const属性。reinterpret_cast用于类型转换,但可能会丢失信息。dynamic_cast在运行时进行类型检查,可以安全地跨越继承层次。
弗兰克的猫
2018/01/09
1.8K0
scala(五) 函数式编程
可变参数 无论是 scala 还是 java 他们都支持 可变参数 java :使用 ... 来表示 scala:使用 * 来表示 案例:
用户1483438
2022/04/12
3820
Scala 【 10 函数式编程 】
​ Scala 中的函数是一等公民,可以独立定义,独立存在,而且可以直接将函数作为值赋值给变量。
Lokinli
2023/03/09
3070
了解 TypeScript 原始类型:探索显式和隐式类型
TypeScript是JavaScript的超集,为JavaScript的动态类型世界引入了静态类型。这使开发人员能够在开发过程中捕获潜在的错误并提高代码的可读性。在TypeScript中,变量可以明确或隐式地定义类型,并且该语言支持各种原始类型。让我们深入了解每种原始类型,探索示例,并了解显式和隐式类型之间的区别。
zayyo
2023/11/30
1840
【类型挑战】获取函数返回类型,难度⭐️⭐️
Dear,大家好,我是“前端小鑫同学”,😇长期从事前端开发,安卓开发,热衷技术,在编程路上越走越远~ 知识运用: 认识什么是returntypetype。 题目分析: 题目地址:2-medium-return-type 如上图所示,我们需要设计一个通用了类型工具还提取函数类型的返回类型,功能同内置的ReturnType。 题目解答: 测试用例: 给出的测试用例挺多但是没有特殊需要说明的,我们只需要通过设计的类型工具取出到通过Equal来进行比较即可。 /* _____________ 测试用例 _
前端小鑫同学
2022/12/26
1.2K0
【类型挑战】获取函数返回类型,难度⭐️⭐️
mysql 隐式类型转换_scala的隐式转换
在mysql查询中,当查询条件左右两侧类型不匹配的时候会发生隐式转换,可能导致查询无法使用索引。下面分析两种隐式转换的情况
全栈程序员站长
2022/11/07
1.9K0
mysql 隐式类型转换_scala的隐式转换
Python 为什么要保留显式的 self ?
布鲁斯·埃克尔(Bruce Eckel)发了篇博文[1],提议从类方法的形参列表中删除“self”。我将解释为什么这个提议不能通过。(译注:Bruce 是《Thinking in Java》、《Thinking in C++》等多本书籍的作者,也是个 Python 开发者。他的文章总结了当年在巴西 Pycon 上的一次讨论,主要观点是在定义类方法时,形参中的“self”是多余的,而且由它引发的报错信息具有一定的误导性。)
Python猫
2019/10/03
5030
Python 为什么要保留显式的 self ?
布鲁斯·埃克尔(Bruce Eckel)发了篇博文[1],提议从类方法的形参列表中删除“self”。我将解释为什么这个提议不能通过。(译注:Bruce 是《Thinking in Java》、《Thinking in C++》等多本书籍的作者,也是个 Python 开发者。他的文章总结了当年在巴西 Pycon 上的一次讨论,主要观点是在定义类方法时,形参中的“self”是多余的,而且由它引发的报错信息具有一定的误导性。)
小白学视觉
2022/05/22
2670
使用强类型的Include显式预加载
Include(i=>i.SubEntity1.Select(j=>j.SubSubEntity1))
全栈程序员站长
2022/07/05
4330
Python 为什么要保留显式的 self ?
大家知道 Python 的类方法里都要带个 self,而不像其它语言那样隐藏起来,这让人略有不爽。与人讨论后得知 Guido 曾经专门撰文解释过这个问题。我抽空先翻译了一下,与大家分享讨论。
Crossin先生
2020/02/26
4870
scala(七) 函数式编程补充
说明: 没有名字的函数就是匿名函数,可以直接通过函数字面量(λ表达式)来设置匿名函数,函数字面量定义格式如下。
用户1483438
2022/04/13
2890
快速学习-Scala函数式编程
在scala中,函数式编程和面向对象编程融合在一起,学习函数式编程式需要oop的知识,同样学习oop需要函数式编程的基础。[矛盾] 关系如下图:
cwl_java
2020/02/27
9310
快速学习-Scala函数式编程
Scala类型推导Scala类型推导
根据Picrce的说法:“类型系统是一个可以根据代码段计算出来的值对它们进行分类,然后通过语法的手段来自动检测程序错误的系统。”
一个会写诗的程序员
2018/08/20
2.6K0
JS面试点-容易搞错的显式/隐式类型转换
(1)如果是布尔值,true和false分别被转换为1和0 (2)如果是数字值,返回本身。 (3)如果是null,返回0. (4)如果是undefined,返回NaN。 (5)如果是字符串,遵循以下规则: 1、如果字符串中只包含数字,则将其转换为十进制(忽略前导0) 2、如果字符串中包含有效的浮点格式,将其转换为浮点数值(忽略前导0) 3、如果是空字符串,将其转换为0 4、如果字符串中包含非以上格式,则将其转换为NaN (6)如果是对象,则调用对象的valueOf()方法,然后依据前面的规则转换返回的值。如果转换的结果是NaN,则调用对象的toString()方法,再次依照前面的规则转换返回的字符串值。
用户10106350
2022/10/28
7380
JS面试点-容易搞错的显式/隐式类型转换

相似问题

函数返回类型是依赖于隐式类型契约,还是总是将其显式化?

20

流lambdas中的显式类型和最终类型

20

如果定义显式构造函数,为什么不生成默认构造函数?

50

具有中断/返回的前置循环与具有显式不变和后置条件的同时循环

60

显式写入默认的空构造函数

30
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文