October 4th, 2011

glider

вычисления на типах

Продвинутые системы типов всегда были для меня загадкой. Умные статейки, например, по Хаскеллу только тем и занимаются, что перетусовывают типы и переставляют их в неожиданных комбинациях. Если честно, несмотря на мою любовь к статически типизируемым языкам, такие техники с трудом влазят мне в голову.

Вычисления на типах, вероятно, являются кульминацией трюков с типами. Литералы Черча, рекурсивные типы, вложенные типы, которыми эмулируются функции... Народ, расскажите, пожалуйста о киллер юзкейсах вычислений на типах потому, что я не могу представить ради чего можно писать ТАКОЕ:

scala> trait TF {
     |   type Apply[A]
     | }
defined trait TF

scala> type Curried2[F[_, _]] = TF {
     |   type Apply[X] = TF {
     |     type Apply[Y] = F[X, Y]
     |   }
     | }
defined type alias Curried2

scala> "a".pure[Curried2[State]#Apply[Int]#Apply]
res7: scalaz.State[Int,java.lang.String] = scalaz.States$$anon$1@1dc1d18
Также крайне интересно было бы узнать об альтернативах вычислениям на типах - вещах более читаемых и обладающих похожей полезностью. Окей, есть макросы, и в Скале мы туда обязательно доберемся, но какие могут быть еще полезные подходы?