File tree Expand file tree Collapse file tree 1 file changed +42
-0
lines changed Expand file tree Collapse file tree 1 file changed +42
-0
lines changed Original file line number Diff line number Diff line change 1+
2+ object BugReport :
3+ trait Executor
4+ trait Updatable [+ A ]
5+
6+ def run (task : Executor ?=> Unit ): Unit = ()
7+ def tupledFunction (a : Int , b : Int ): Unit = ()
8+ def tupledSequence (f : ((Updatable [Int ], Updatable [Int ])) => Unit ): Unit = ()
9+
10+ type UpdatableMap [T <: Tuple ] = T match
11+ case EmptyTuple => EmptyTuple
12+ case h *: t => Updatable [h] *: UpdatableMap [t]
13+ // eliminate the match type
14+ type xUpdatableMap [_] = (Updatable [Int ], Updatable [Int ])
15+
16+ // so that expected type is satisfied, avoid eta-expansion and subsequent error
17+ transparent inline
18+ def liftAsTupledInThreads [A <: Tuple ](f : A => Unit )(using e : Executor ): UpdatableMap [A ] => Unit = _ => ()
19+ // eliminate eta-expansion where the partial application returns a context function
20+ def xliftAsTupledInThreads [A <: Tuple ](f : A => Unit ): Executor ?=> UpdatableMap [A ] => Unit = _ => ()
21+
22+ run :
23+ tupledSequence(liftAsTupledInThreads(tupledFunction.tupled)) // error
24+
25+ run :
26+ val lifted = liftAsTupledInThreads(tupledFunction.tupled)
27+ // the expected type induces the symptom
28+ // val lifted: ((Updatable[Int], Updatable[Int])) => Unit = liftAsTupledInThreads(tupledFunction.tupled)
29+ tupledSequence(lifted)
30+
31+ object BugReport2 :
32+ trait Executor
33+ trait Updatable [+ A ]
34+
35+ def run (task : Executor ?=> Unit ): Unit = ()
36+ def function (a : Int ): Unit = ()
37+ def normalSequence (f : Updatable [Int ] => Unit ): Unit = ()
38+
39+ def liftInThreads [A ](f : A => Unit )(using e : Executor ): Updatable [A ] => Unit = _ => ()
40+
41+ run :
42+ normalSequence(liftInThreads(function))
You can’t perform that action at this time.
0 commit comments