Можно ли «карри» более высокопородных типов в Scala? - PullRequest
21 голосов
/ 06 июня 2011

Предположим, у меня есть черта с двумя параметрами типа, например,

trait Qux[A, B]

и другая черта с параметром типа с более высоким родом, например

trait Turkle[C[_]]

Я хотел бы иметь возможность заменить фиксированное значение для одного из параметров типа на Qux, чтобы его можно было использовать для параметризации Turkle.

Вот пример (кода, который не имеет смысла в Scala!):

trait Baz[A] extends Turkle[Qux[A, _]]

У кого-нибудь есть идеи, как этого добиться?

Ответы [ 4 ]

23 голосов
/ 06 июня 2011

Джейсон Заугг придумал самый лаконичный способ сделать это:

trait Baz[A] extends Turkle[({type x[a]=Qux[A, a]})#x]

Плагин IntelliJ для Scala при желании свернет это до:

trait Baz[A] extends Turkle[x[a]=Qux[A, a]]
3 голосов
/ 06 июня 2011

Ты имеешь в виду что-то подобное?

trait QuxWithString[A] extends Qux[A, String]
new Turkle[QuxWithString]{}

Это аналог частичного применения для типов.

2 голосов
/ 06 июня 2011
trait Turkle[C[_]]
trait Qux[A,B]
trait Wraps[A] {
  type Jkz[X] = Qux[A,X]
  trait Baz extends Turkle[Jkz]
}
0 голосов
/ 06 августа 2015

Плагин компилятора вид проектора также позволяет это:

// Explicit lambda, greek letters
trait Baz[A] extends Turkle[λ[α=>Qux[A,α]]]

// Explicit lambda, normal letters
trait Baz[A] extends Turkle[Lambda[a=>Qux[A,a]]]

// No explicit lambda, ? placeholder    
trait Baz[A] extends Turkle[Qux[A,?]]
...