Unit和Nothing有什么区别?
Unit
和Nothing
表示一个不返回任何东西的函数。 他们之间有什么区别?
Unit
是只有一个值的types – 请参见单位types 。 另一方面, Nothing
都没有可能的价值 – 见Bottomtypes 。
一个不返回任何东西的函数必须有返回typesUnit
。 如果它是Nothing
那么函数不能返回结果。 退出函数的唯一方法将是一个例外。
Nothing
是以不同的方式使用的。 它具有两个特点:
-
Nothing
是其他types的子types(包括Null
)。 - 不存在这种types的实例。
什么时候这有用? 考虑None
:
object None extends Option[Nothing]
由于Option
在其types参数中是协变的, Nothing
是所有types的子types,所以对于每个typesA
, Option[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只有一个值 – ()
),所以你不能返回Nothing
types的值,(b)它是其他types的子types。 也就是说,如果有什么types的Nothing
,就可以用在需要其他types的地方,但是不会产生任何结果。 这用于处理exception – throw
expression式有一个Nothing
types,所以它可以基本上在程序中的任何地方使用。
简单地说, Nothing
意味着有错误,没有东西被返回,而Unit
意味着有副作用。
在Scala编程有一个很好的解释。
在Petr的回复中添加一个方面:在types层次结构中Nothing
重要的angular色。 这是一个底部types。 这意味着它是所有其他types的子types,就像Any
东西都是相反的,这是Any
东西的超types。 你可以在这里find一个很好的解释。