我是scala的新手,读scala的编程。我在书中的各个页面中找到了术语函数类型、函数值和函数对象。例如:
例如,在其他语言中,对象和函数可能有两个不同的概念,在Scala中,函数值是一个对象。函数类型是子类可以继承的类。
请您解释函数类型、函数值和函数对象,以及它们之间的区别?还有,上面的引文是什么意思?
发布于 2017-08-25 17:18:27
在Scala中,函数与“普通”值没有什么不同。
val inc: Int => Int = x => x + 1是同一个概念
val s: String = "hello world"对于任何val x: T = e,x是类型为T的值的名称,x是计算e的结果。
inc是值/对象,就像s是值/对象一样。我认为价值和客体在本质上是一样的。
发布于 2017-08-25 19:16:35
让我从非函数类型、值和对象开始。
scala> val foo:String = "bar"
foo: String = bar这里,type是String,value是bar,object实例是foo。注意,value本质上是一个字符串类型的对象。例如,(只是为了了解值和对象之间的概念):
scala> val foo_copy = foo
foo_copy: String = bar在这里,对象foo被分配给foo_copy。由于在上述情况下foo是对象,所以它是对象foo_copy的值。
现在让我来看看函数示例:
在scala中,函数是一个值,您可以将它赋值给变量。
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 的某个类的实例。这意味着:
type: (String, String) => String = Function2[String, String] //2 - number of parameter因此,类可以扩展到函数类型。class A extends ((String, String) => String)实际上是由Scala翻译成class A extends Function2[String, String]的。此外,函数类型可以作为函数中的参数类型,这些函数是高阶函数。
发布于 2017-08-25 17:09:52
val f: Int => String = i.toStringf是一个包含函数引用的值,我猜它可以被称为函数值。Int => String是一个函数类型,它对应于一个从整数到字符串的函数。f也是一个对象(我从未读过函数对象),例如,您可以调用f.toString和f.hashCode,就像在任何其他对象上一样。https://stackoverflow.com/questions/45886107
复制相似问题