Не уверен, что это подходит как к лучшему, но вот один подход, который @kmizu написал в твиттере на днях:
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
Вы можете сделать его немного лучше, используя псевдонимы символических типов.
scala> type ![F[_, _]] = TF {
| type ![X] = TF {
| type ![Y] = F[X, Y]
| }
| }
defined type alias $bang
scala> "a".pure[![State]# ![Int]# !]
res9: scalaz.State[Int,java.lang.String] = scalaz.States$$anon$1@1740235