Value types
Value type
Scalaのコードで書ける型のこと(だと思う)。つまり、
type t = X
のX
に書けるようなものである。
Value typeはabstractとconcreteの二種類に分かれる。
Abstract value type
Type parameterまたは(override
されていない)abstract type memberのこと。
Concrete value type
上記以外。Int
やList[Int]
など。
ややこしいがabstract class
はconcreteである。
Type-level Memoization
Scalaはtype-levelの計算をメモ化する(かのように動いている)。 同じtype-expressionは再計算されない。しかも、かなり貪欲であり 計算できるもの(結果としてconcrete value typeになるもの)は前もって計算する。
// A sort of `declval` in C++ def dummy[x] = null.asInstanceOf[x] makro.Benchmark { dummy[fibonacci[Dense._30]] // 922ms } // greedy type res[x] = fibonacci[Dense._40] makro.Benchmark { dummy[fibonacci[Dense._40]] // 0ms (memoized) }
(たぶん、このようなtop-levelでのメモ化は最近サポートされたばかりだと思う)
Abstract typemethod
Scalaはkindもtypeも区別がない。たとえば、
trait bar { type foo <: Any }
のfoo
はabstract value typeなのにbarという型が作れてしまっている(当たり前)。
つまり、type-level的には型安全性が弱まっている。
一応、macroでabstractかconcreteなのかを、 (concrete value typeが返ってくると期待しているときは)チェックできるようである。
def isAbstract[x](c: Context)(tx: c.WeakTypeTag[x]): Boolean = { import c.universe._ weakTypeOf(tx).typeSymbol.asType.isAbstractType }