scala - Scala 中如何评估方法?

标签 scala functional-programming substitution evaluation

方法类型没有值。我们如何评估一个方法?

以SML为例,我有

fun myFunc(x) = x + 5
val b = myFunc(2)

在第二个表达式中,myFun有一个类型和一个值,我们使用它的类型进行类型检查,并使用它的值和它的参数一起计算b的值>

但是在没有值的 Scala 方法中我们如何评估?我对 Scala 还很陌生,所以可能不是很清楚。

def myFunc(x) = x + 5
val b = myFunc(2)

val b = myFunc(2)val b = 2 + 5,中间发生了什么?我们从哪里或什么对象知道 myFunc(x)x + 5

谢谢!!

最佳答案

简单的答案是:仅仅因为方法不是“可以由操纵的东西”意义上的值,并不意味着它不是某种意义上的值“编译器的作者可以操纵的东西”。

当然,方法将有一个在编译器内部表示它的对象。事实上,该对象可能看起来与表示 MLton SML 编译器或 SML/NJ 等内部函数的对象非常相似。

在 SML 中,语法不是一个值,但您也不会质疑如何编写函数调用,不是吗?毕竟,为了在 SML 中调用函数,我需要使用函数调用语法编写函数调用,那么当语法不是值时我该怎么做呢?

嗯,答案是一样的:仅仅因为语法不是程序员可以操纵的值,编译器(或更准确地说是解析器)显然>知道语法。

我无法告诉你为什么决定让 Scala 中的函数为值而不是方法,但我可以猜测一下。 Scala 是一种面向对象的语言。在面向对象的语言中,每个值都是一个对象,每个对象都有绑定(bind)到该对象的方法。因此,如果方法是对象,那么它们就需要有方法,方法是对象,方法有方法,方法是对象,依此类推。

当然有很多方法可以解决这个问题,但这会使语言变得更加复杂。出于类似的原因,类不是对象(与 Smalltalk、Python 和 Ruby 中的对象不同)。请注意,即使在像 Ruby 这样高度反射(reflection)、内省(introspection)、动态的语言中,方法也不是对象。类是,但不是方法。

可以使用反射来获取代表方法的代理对象,但该对象不是方法本身。实际上,您也可以在 Scala 中执行相同的操作。

当然,可以通过 η 扩展将方法转换为函数值。

关于scala - Scala 中如何评估方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63856674/

相关文章:

java - 在 sbt 中强制执行 Scala 项目的 Java 版本?

java - 玩! 2.1 要我写scala代码

algorithm - 将此算法转换为不使用递归的过程

linux - 在 Makefile 中使用 xargs basename

regex - Vim 替换命令中感叹号有什么用

scala - 与 pipeTo 等效的 Akka 类型是什么?

scala - 如何将完全格式化的 SQL 与 Spark 结构化流结合使用

compiler-construction - 在按名称调用和按值调用下会打印什么?

f# - 可重复的模式匹配

python - 用正则表达式检查大小写?