gpt4 book ai didi

scala - 为什么在Scala中定义方法时添加了 ": Unit = "?

转载 作者:行者123 更新时间:2023-12-01 09:13:59 26 4
gpt4 key购买 nike

伙计们,我正在尝试学习 Scala,我使用 IntelliJ IDEA 来做到这一点,问题是我在互联网上看到了一段代码,其中方法定义如下:

def move(dx: Int, dy: Int, dz: Int) {}

但是当我尝试在 IntelliJ IDEA 中定义方法时,它会在大括号之前自动添加:“Unit =”,我不知道这是什么意思?像这样 :
 def move(dx: Int, dy: Int, dz: Int): Unit ={}

感谢您的帮助

最佳答案

过程语法

def methodName(arg1: Type1, ..., argN: TypeN) {
/* method body */
}

只是返回类型为 Unit 的方法的语法糖。它相当于
def methodName(arg1: Type1, ..., argN: TypeN): Unit = {
/* method body */
}
Unit 类型包含一个值:空元组 () 。因此,除非该方法通过抛出异常或错误异常退出,否则它会返回空元组 () 。这反过来意味着方法的返回值并不重要,因为除了方法终止之外,它不包含任何有意义的信息。因此,它通常用于仅因副作用而执行的方法。

正如 Emre Sevinç 正确指出的那样,不应再使用过程语法,它可以帮助您避免键入六个字符,但会使整个语法变得不那么一致,因此并不值得。

这不是一个答案,而是试图理清有关 Unitvoid 的混淆。

虽然乍一看 Unit 的使用方式似乎与 voidC 等语言中的使用方式相同,但实际上完全不同,因为 Unit 实际上确实有一个值,而 void 中通常(令人困惑)没有 C 类型的值-类语言。这使得从 Unit 构造更复杂的值成为可能。例如,
List( (), (), (), (), () )

List[Unit] 类型的值,可以表示自然数。相似地,
Left( () ); Right( () )

Either[Unit, Unit] 类型的值,可以表示 bool 值。这两个例子显然是人为的。 “Scala 中的函数式编程”(P. Chiusano,R. Bjarnason)中提供了一个更实质和实际的示例,其中 () 在从 map 类型类中的 map2 派生 Applicative[F[_]] 时派上用场:
def map[B](fa: F[A])(f: A => B): F[B] =
map2(fa, point( () ))((a, _) => f(a))

// ^
// |
// Here is it

(这在没有上下文的情况下是不应该被理解的:我只想提供一个具体的例子, () 可用于在非常通用的框架中定义非常基本的方法)

从高层次的角度来看,在语言中拥有类型 Unit 是一件非常好的事情,因为它使类型和函数的类别成为 cartesian closed (它是定义第一部分的“终端对象”)。这使得语言整体上更加一致和对称。

关于scala - 为什么在Scala中定义方法时添加了 ": Unit = "?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49647276/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com