Higher-Rank Polymorphism in Scala を訳した

https://gist.github.com/3300312

元記事は2010年7月2日と、(このblog書いてる時点から)もう2年以上前の記事ですが、未だに日本語の情報少ないというか、まぁ(頻繁に必要になるものでもないからだろうから)それほど理解している人少ないので。ちょっとまえのScala勉強会でも話題になっていたらしいし
ちなみに元記事のblogは以前も紹介しましたが
Scala上級者になるために読んでおくべき海外blogまとめ
Scalazのコミッターの人です。


これら rank-2 polymorphism などの、HaskellなどではHaskellGHC拡張使えば第一級で文法としてサポートされている機能だが、Scalaだと自前で trait 作ってゴニョゴニョしないときけない場合がある程度ある。
Haskellだと @mr_konn さんのPFIセミナーでのHaskellを例にした型システムの話での、このスライド http://www.slideshare.net/konn/how-wonderful-to-be-statically-typed/39
の39ページから、60ページあたりとか。
その後の実際のrank 2の応用例としてリソースアクセスとかリージョンについて話してるところも関連。

それらrank 2などは、もちろん未だにScalaの標準ライブラリには入っていないし、入る予定も無さそう。

Scalaz(6にも、開発中の7にも)には、色々含まれてる
https://github.com/scalaz/scalaz/blob/v6.0.4/core/src/main/scala/scalaz/Category.scala
https://github.com/scalaz/scalaz/blob/v6.0.4/core/src/main/scala/scalaz/Forall.scala
https://github.com/scalaz/scalaz/blob/v7.0.0-M2/core/src/main/scala/scalaz/NaturalTransformation.scala
https://github.com/scalaz/scalaz/blob/v7.0.0-M2/core/src/main/scala/scalaz/package.scala#L92


4年も前に @kmizu さんが触れていたりする*1
http://d.hatena.ne.jp/kmizushima/20080530/1212121329

shapelessというライブラリにもある
http://www.chuusai.com/2012/05/10/shapeless-polymorphic-function-values-2/



最後に重要なのが、このblogの最後で

I wonder if we can use this to get static guarantees of safe resource access, as in the SIO monad detailed in Lightweight Monadic Regions.

となっている、いわゆるRegionが、現在開発中のScalaz7ですでに実装されているということ

https://github.com/scalaz/scalaz/blob/v7.0.0-M2/effect/src/main/scala/scalaz/effect/RegionT.scala#L6-8

だれかこれの、わかりやすい使い方を・・・。
閉じたリソースにアクセスするのを型で防ぐという点だけ聞くと、ある意味ローンパターンと目的は同じというか、共通する部分はあるのだろうけど、それに加えて、Monadになっていて、pureに操作できて、遅延評価もできたりして、色々汎用的なのかな?とか勝手に思ってる

*1:当時のScalaの機能の制限なのか、もとのOCamlのコードを忠実にエミュレートしようとしたからなのか、表し方はちょっと違っている?ようだが