PS

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

上記以外。IntList[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
    }

参考文献