24

Let's suppose I have a trait with two type parameters, e.g.

trait Qux[A, B]

and another trait with a higher-kinded type parameter, e.g.

trait Turkle[C[_]]

I'd like to be able to substitute a fixed value for one of the type parameters for Qux, so that it can be used to parametrize Turkle.

Here's an example (of code that doesn't make sense in Scala!):

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

Anyone have any ideas how to achieve this effect?

Dmytro Mitin
  • 48,194
  • 3
  • 28
  • 66
Scott Morrison
  • 3,100
  • 24
  • 39
  • This compiles, although I have absolutely no idea if this is what you want: `type QuxApplied[A] = Qux[A, _]; trait Baz[A] extends Turkle[QuxApplied]` – huynhjl Jun 06 '11 at 05:08
  • 1
    @huynhjl - My guess is that it is supposed to be the same `A`, which is not the case in your example. – Rex Kerr Jun 06 '11 at 05:15

5 Answers5

24

Jason Zaugg came up with the most succinct way to do this:

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

IntelliJ's Scala plugin will optionally collapse this to:

trait Baz[A] extends Turkle[x[a]=Qux[A, a]]
Lachlan
  • 3,744
  • 2
  • 26
  • 29
4

You mean something like this?

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

This is the analog to partial application for types.

Kim Stebel
  • 41,826
  • 12
  • 125
  • 142
2
trait Turkle[C[_]]
trait Qux[A,B]
trait Wraps[A] {
  type Jkz[X] = Qux[A,X]
  trait Baz extends Turkle[Jkz]
}
Rex Kerr
  • 166,841
  • 26
  • 322
  • 407
  • This is actually pretty good. In my use cases it's not so unusual to have nested traits anyway, so there's little feeling of writing boilerplate. – Scott Morrison Jun 09 '11 at 00:49
1

The compiler plugin kind projector allows this as well:

// 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,?]]
Markus1189
  • 2,829
  • 1
  • 23
  • 32
1

Scala 3 is proposing SIP: Underscore Syntax for Type Lambdas #5379 such that the following might be possible

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

Scala 3 natively provides type lambdas using [X] =>> F[X] syntax so try

trait Baz[A] extends Turkle[[B] =>> Qux[A, B]]
Mario Galic
  • 47,285
  • 6
  • 56
  • 98