Unit和Nothing之间有什么区别?

Rea*_*onk 56 scala

这两种类型Unit,并Nothing表示不返回任何一个功能.他们之间有什么区别?

Pet*_*lák 77

Unit是一个只有一个值的类型 - 请参阅单位类型.在另一方面,Nothing没有可能值-见底部类型.

不返回任何内容的函数必须具有返回类型Unit.如果是,Nothing则函数无法返回结果.退出函数的唯一方法是异常.


Nothing以不同的方式使用.它的特点是两个属性:

  1. Nothing是每种其他类型(包括Null)的子类型.
  2. 没有这种类型的实例.

什么时候有用?考虑None:

object None extends Option[Nothing]
Run Code Online (Sandbox Code Playgroud)

因为Option它的类型参数是协变的并且Nothing是所有东西Option[Nothing]的子类型,所以Option[A]是每种类型的子类型A.因此,我们可以创建一个对象None,它是Option[A]每个对象的子类型A.这是合理的,因为Nothing无法实例化,所以Option[Nothing]总是没有值.同样

object Nil extends List[Nothing]
Run Code Online (Sandbox Code Playgroud)

Unit对应于逻辑真,并且Nothing对应于Curry-Howard同构下的逻辑假,其中我们将类型视为命题和函数作为证明,.


scr*_*tin 22

Unit意味着(a)功能具有输入和输出等副作用,(b)这些副作用是该功能的主要目标.当然,即使它的类型不同,功能也可能有副作用Unit.

Nothing是Scala中的一种特殊类型,因为(a)它没有值(Unit只有一个值 - ()),所以你不能返回类型的值Nothing和(b)它是每个其他类型的子类型.这意味着,如果某些东西有类型Nothing,它可以在需要其他类型的每个地方使用,但它不会产生任何结果.这用于处理异常 - throw表达式有一种类型Nothing,因此它基本上可以在程序的任何地方使用.

简单地说,Nothing意味着存在错误并且没有返回任何内容,同时Unit意味着存在副作用.

Scala中的编程对此有一个很好的解释.


blu*_*e10 7

为Petr的回复添加一个方面:Nothing在类型层次结构中起着重要作用.这是一种底部类型.这意味着它是所有其他类型的子类型,与其相反Any,它是一切的超类型.你可以在这里找到一个很好的解释.