Unit和Nothing有什么区别?

UnitNothing表示一个不返回任何东西的函数。 他们之间有什么区别?

Unit是只有一个值的types – 请参见单位types 。 另一方面, Nothing没有可能的价值 – 见Bottomtypes 。

一个不返回任何东西的函数必须有返回typesUnit 。 如果它是Nothing那么函数不能返回结果。 退出函数的唯一方法将是一个例外。


Nothing是以不同的方式使用的。 它具有两个特点:

  1. Nothing是其他types的子types(包括Null )。
  2. 不存在这种types的实例。

什么时候这有用? 考虑None

 object None extends Option[Nothing] 

由于Option在其types参数中是协变的, Nothing是所有types的子types,所以对于每个typesAOption[Nothing]都是Option[A]的子types。 因此,我们可以为每个A创build一个对象None ,它是Option[A]的子types。 这是合理的,因为Nothing不能被实例化,所以Option[Nothing]将永远是没有价值的。 同样

 object Nil extends List[Nothing] 

Unit对应于逻辑真, Nothing对应于Curry-Howard同构下的逻辑假,我们把types视为命题和函数来certificate。

Unit意味着(a)function具有input和输出的副作用,(b)这些副作用是function的主要目标。 当然,function可能会有副作用,即使它的types不同于Unit

Nothing是Scala中的特殊types,因为(a)它没有值(Unit只有一个值 – () ),所以你不能返回Nothingtypes的值,(b)它是其他types的子types。 也就是说,如果有什么types的Nothing ,就可以用在需要其他types的地方,但是不会产生任何结果。 这用于处理exception – throwexpression式有一个Nothingtypes,所以它可以基本上在程序中的任何地方使用。

简单地说, Nothing意味着有错误,没有东西被返回,而Unit意味着有副作用。

在Scala编程有一个很好的解释。

在Petr的回复中添加一个方面:在types层次结构中Nothing重要的angular色。 这是一个底部types。 这意味着它是所有其他types的子types,就像Any东西都是相反的,这是Any东西的超types。 你可以在这里find一个很好的解释。