ScalaのNothingタイプ

3494 ワード

初めてScalaを学んだとき、不思議なことに出会った:Nothing.翻訳すると「何もない」と言いますか?このNothingはいったい何なのか、何の役に立つのか.以下は私の個人的な見解です.
  • Nothingとは何ですかNothingはタイプです.Int、Stringのように1つのタイプで、例えば値3はInt型で、値「abc」はString型で、Int、Stringとは異なり、Nothing型の値は存在しない.Nothingというタイプにはもう一つの特徴があります.彼はBottom Typeで、Bottom typeとは彼が他のすべてのタイプのサブタイプ(Sub Type)(The bottom type is a subtype of all types.)です.したがって、NothingはIntのサブタイプであり、NothingもStringのサブタイプであると考えられる.次に、Scala Reference 3.5.2 Conformanceから抜粋します.
    For every value type T , scala.Nothing <: T <: scala.Any For every type constructor T (with any number of type parameters), scala.Nothing <: T <: scala.Any
  • Nothingの意味の1つ:タイプパラメータ(covariant parameterized types)に使用されます.まず,Scalaの汎用型は型パラメータを加えないことは許されない.以下Programming In Scale,2 nd Edition,Chapter 19 Type Parameterizationより抜粋する
    Unlike Java, which allows raw types, Scala requires that you specify type parameters. (Javaのようにraw typeを許可するのではなく、Scalaはタイプパラメータを指定しなければならない)
    したがって、以下の2つの行でエラーが発生します.Error:type List takes type parameters
    type myList = List
    val li: List = List(1)
    
    は、リスト(1)にInt型の要素:1があるため、彼のタイプはList[Int]です.はい、make sense、リストのタイプはこのリストの要素に依存します.従って、List(「abc」)は、List[String]型であり、List(「abc」、1)はList[Any]であり、「abc」と1は、いずれもAny型のサブタイプであるからである.タイプガイドはこのように働いています.ではList()は?空のリストですが、彼はどんなタイプですか?きっとList[Int]ではなく、中にはIntもなく、List[Any]でもないので、中には何もないので、他のタイプを導き出す理由がないので、このList()はList[Nothing]しかありません.
    type myList = List[String]
    val li: List[Int] = List(1)
    
    NilはList[Nothing]から継承されている.だからできるんだ1:Nilとabc:Nil.NilがList[Nothing],Nothingがbottome type,Listがコヒーレントだから1:NillがList[Int],「abc」:NilがList[String]になる
    scala> val l = List()
    l: List[Nothing] = List()
    
    小実験、次はコンパイルして実行できますか?ml 1のタイプは何ですか?
    case object Nil extends List[Nothing] {
      override def isEmpty = true
      def head: Nothing =
        throw new NoSuchElementException("head of empty list")
      def tail: List[Nothing] =
        throw new NoSuchElementException("tail of empty list")
    }
    
    の意味の2つは、非正常な脱退を表す.例えば投げ異常.これもmake sense、異常か、きっと何も戻らない、タイプはNothingしかない.
    val ml: List[String] = List()
    val ml1 = 2 :: ml
    
    上のNilのhead法も一例である.ここにもNothingのBottom Typeのメリットが表れています.
    scala> def e = throw new Exception("s")
    e: Nothing
    
    型導出下プログラムを観察したところ,このer法には2つの可能な戻り型があり,1つはInt,1つはNothingであることが分かった.NothingはBottom Typeであるため,NothingはIntのサブクラスであるため,これら2つの戻り可能なタイプはいずれもIntであると考えられているため,erメソッドの戻り値はIntであると推定した.

  • こんなにたくさん言ったのに、Docにはいくつかの言葉があります.
    Nothing is - together with scala.Null - at the bottom of Scala's type hierarchy.
    Nothing is a subtype of every other type (including scala.Null); there exist no instances of this type. Although type Nothing is uninhabited, it is nevertheless useful in several ways. For instance, the Scala library defines a value scala.collection.immutable.Nil of type List[Nothing]. Because lists are covariant in Scala, this makes scala.collection.immutable.Nil an instance of List[T], for any element of type T.
    Another usage for Nothing is the return type for methods which never return normally. One example is method error in scala.sys, which always throws an exception.
    要約すると、NothingはBottomタイプであり、Nothingタイプに属する値は存在しません.主に2つの用途があり、タイプパラメータと非正常な終了を表します.
    参考資料:1:http://en.wikipedia.org/wiki/Bottom_type 2: http://www.scala-lang.org/docu/files/ScalaReference.pdf 3: http://www.scala-lang.org/api/2.10.4/index.html#scala.Nothing 4: Programming In Scala, 2nd Edition