Using context bounds with more than one type parameter (=:=)


#1

I have the following function:

  def combine1[L1 <: S, L2 <: S, T1, T2](a: BaseSampler[L1,T1], b: BaseSampler[L2,T2])(implicit ev1: L1 =:= L2 ) =
    ComplexSampler[L1, T1, T2](a.x, b.x)

that works correctly. However the Scala compiler (2.12.2) complaints that the ev is not used. So I thought I could use the implicitly construct and tried this:

  def combine1[L1 <: S, L2 <: S, T1, T2](a: BaseSampler[L1,T1], b: BaseSampler[L2,T2]) = {
    implicitly[L1 =:= L2]
    ComplexSampler[L1, T1, T2](a.x, b.x)
  }

which fails with:

Cannot prove that L1 =:= L2.
[error]     implicitly[L1 =:= L2]
[error]               ^

Of course this fails because I have no context bound for =:= for two type parameters. The question now is, how can I add that context bound? I have found a possible solution in [1] but cannot get it to work.

Can anyone point me in the right direction?

TIA

  1. https://stackoverflow.com/questions/4373070/how-do-i-get-an-instance-of-the-type-class-associated-with-a-context-bound/4373153#4373153

#2

It looks like you don’t really need the L2 type parameter to the combine1 method at all. Can you try leaving it out? E.g.:

def combine1[L <: S, T1, T2](a: BaseSampler[L, T1], b: BaseSampler[L, T2]) =
  ComplexSampler[L, T1, T2](a.x, b.x)

The issue is that if you have L1 <: S and also L2 <: S, you can’t at the same time say that L1 =:= L2. You have to get rid of one or the other assertion.


#3

Oops. Yeah, that is a trivial solution to a bad example. What I really want is to do things like implicitly[L1 =:= S1] were S1 extends S. I would actually have two or more implicit parameters.