scala で型のところに出てくる #

# というのはこういうやつ → ({type λ[α]=State[S, α]})#λ

先日のscalaz勉強会でも質問があって触れられていましたが(↓)

type HogeF[A] = Hoge[F, A]みたいなのよくあるな、というのは最近scalazとか見ていて思っていて、それが型パラメータの部分で適用できないからというのもわかってきてたのでこれもそういうだったのかということで納得。

これ # なのでぐぐっても調査がしにくいので以前困った。yuroyoroさんの記事にはたどりつけなかったなぁ。。

Type Projection

SimpleType  ::=  SimpleType ‘#’ id
A type projection T#x references the type member named 

言語仕様的には#は Type Projectionというもの。

#で調べていたらひしだまさんのこれにたどりついて、これ見てもどう関係があるのか全くわからなかったけど、型パラメータを部分適用したtypeを持ってる匿名クラス(? 構造的部分型?)を定義して、#を使ってその内部クラス(型)にアクセスしてそれを型として指定して使うっていう感じか。

そういえばIterator パターンの本質でも匿名型としてこの書き方について触れてた