首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scala中的函数类型、函数值和函数对象

scala中的函数类型、函数值和函数对象
EN

Stack Overflow用户
提问于 2017-08-25 16:47:32
回答 4查看 1.7K关注 0票数 1

我是scala的新手,读scala的编程。我在书中的各个页面中找到了术语函数类型、函数值和函数对象。例如:

例如,在其他语言中,对象和函数可能有两个不同的概念,在Scala中,函数值是一个对象。函数类型是子类可以继承的类。

请您解释函数类型、函数值和函数对象,以及它们之间的区别?还有,上面的引文是什么意思?

EN

回答 4

Stack Overflow用户

发布于 2017-08-25 17:18:27

在Scala中,函数与“普通”值没有什么不同。

代码语言:javascript
复制
val inc: Int => Int = x => x + 1

是同一个概念

代码语言:javascript
复制
val s: String = "hello world"

对于任何val x: T = ex是类型为T的值的名称,x是计算e的结果。

inc是值/对象,就像s是值/对象一样。我认为价值和客体在本质上是一样的。

票数 2
EN

Stack Overflow用户

发布于 2017-08-25 19:16:35

让我从非函数类型、值和对象开始。

代码语言:javascript
复制
scala> val foo:String = "bar"
foo: String = bar

这里,typeStringvaluebarobject实例是foo。注意,value本质上是一个字符串类型的对象。例如,(只是为了了解值和对象之间的概念):

代码语言:javascript
复制
scala> val foo_copy = foo
foo_copy: String = bar

在这里,对象foo被分配给foo_copy。由于在上述情况下foo是对象,所以它是对象foo_copy的值。

现在让我来看看函数示例:

在scala中,函数是一个值,您可以将它赋值给变量。

代码语言:javascript
复制
scala> val foo: (String, String) => String = (a:String, b:String) => a + b
foo: (String, String) => String = <function2>

这里,函数类型(String, String) => String (取2个字符串参数并返回字符串类型的值),表达式(a:String, b:String) => a + b是一个function literal,被编译成一个类,然后在运行时实例化为函数值。在上面的代码中,<function2>是一个函数值,本质上是一个对象。注意,不要将函数值与从此函数调用中获得的值混淆。

最后,foo是一个类型为(String, String) => String函数对象,这里的函数对象和函数值也是相同的。请注意,函数值是扩展到FunctionN class 的某个类的实例。这意味着:

代码语言:javascript
复制
type: (String, String) => String = Function2[String, String]  //2 - number of parameter

因此,类可以扩展到函数类型。class A extends ((String, String) => String)实际上是由Scala翻译成class A extends Function2[String, String]的。此外,函数类型可以作为函数中的参数类型,这些函数是高阶函数

票数 2
EN

Stack Overflow用户

发布于 2017-08-25 17:09:52

代码语言:javascript
复制
val f: Int => String = i.toString
  • f是一个包含函数引用的值,我猜它可以被称为函数值。
  • Int => String是一个函数类型,它对应于一个从整数到字符串的函数。
  • f也是一个对象(我从未读过函数对象),例如,您可以调用f.toStringf.hashCode,就像在任何其他对象上一样。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45886107

复制
相关文章

相似问题

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