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只有一个值 – () ),所以你不能返回Nothingtypes的值,(b)它是其他types的子types。 也就是说,如果有什么types的Nothing ,就可以用在需要其他types的地方,但是不会产生任何结果。 这用于处理exception – throwexpression式有一个Nothingtypes,所以它可以基本上在程序中的任何地方使用。 
 简单地说, Nothing意味着有错误,没有东西被返回,而Unit意味着有副作用。 
在Scala编程有一个很好的解释。
 在Petr的回复中添加一个方面:在types层次结构中Nothing重要的angular色。 这是一个底部types。 这意味着它是所有其他types的子types,就像Any东西都是相反的,这是Any东西的超types。 你可以在这里find一个很好的解释。