คลาสที่แยกกำหนดสำหรับ akka อสายข้อมูล SubFlow(ทั่วไปทางราต้องพึ่งประเภท)

0

คำถาม

ฉันมีช่วงเวลาที่ยากลำบากมากที่จะได้เป็น implicit class สำหรับ akka.stream.scaladsl.SubFlow ต้อง compile.

ของฉันทดสอบรหัส:

val subFlow = Source(List("1", "2", "3"))
  .groupBy(1, f)

val richSubFlow = new SideEffectfulSubFlowOps(subFlow)

val got = richSubFlow
  .withSideEffect((elem: String) => recordedItems.add(elem))
  .mergeSubstreams
  .to(Sink.seq)

/* In the end I would like to write it like this:
val got = Source(List("1", "2", "3"))
  .groupBy(1, f)
  .withSideEffect((elem: String) => recordedItems.add(elem))
  .mergeSubstreams
  .to(Sink.seq)
*/ 

คนแยกห้องข้าก็ทำมาจนป่านนี้แล้วนี่

  implicit class SideEffectfulSubFlowOps[+Out, +Mat, FOps <: FlowOps[Out, Mat], C](val enrichedSubFlow: SubFlow[Out, Mat, FOps#Repr, C]) extends AnyVal {

    def withSideEffect(f: Out => Unit): enrichedSubFlow.Repr[Out] = {
      enrichedSubFlow.map { o =>
        f(o)
        o
      }
    }
  }

โชคร้ายที่ฉันไม่สามารถคิดออกที่เหมาะสมประเภททั่วไปเพื่อกำหนดสำหรับคนแยกห้องเรียน

ที่คอมไพเลอร์เกิดข้อผิดพลาด:

[error] SubFlowExtensionsSpec.scala:21:43: type mismatch;
[error]  found   : akka.stream.scaladsl.SubFlow[String,akka.NotUsed,[+O]akka.stream.scaladsl.Source[O,akka.NotUsed],akka.stream.scaladsl.RunnableGraph[akka.NotUsed]]
[error]  required: akka.stream.scaladsl.SubFlow[?,?,?#Repr,?]
[error]       val x = new SideEffectfulSubFlowOps(subFlow)

มองที่นิยามของ subflow: trait SubFlow[+Out, +Mat, +F[+_], C] extends FlowOps[Out, Mat] ฉันไม่เข้าใจว่าทำไมฉันต้องการที่จะกำหนดทั่วไปประเภทของคลาสที่แยกกำหนดซึ่งนั้นใช้สำหรับประเภท F แล้ว C ของ SubFlow.

1

คำตอบที่ดีที่สุด

0

พยายามจะใช้สูง-kinded ประเภทพารามิเตอร์ที่อยู่ในนิยามของ SubFlow

implicit class SideEffectfulSubFlowOps[+Out, +Mat, +FOps[+_], C](val enrichedSubFlow: SubFlow[Out, Mat, FOps, C]) extends AnyVal
2021-10-25 16:13:06

ฉันลองแล้วและมันก็ยังไม่ทำงาน คอมไพเลอร์เกิดข้อผิดพลาด: argument expression's type is not compatible with formal parameter type
leozilla

@leozilla ไม่สามารถ reproduce. scastie.scala-lang.org/RlTubBvcTQadwh9S7dW7Kw ได้โปรดให้ตลอดรหัสนั่นมันไม่ compile กับข้อผิดพลาดนี้ด้วย
Dmytro Mitin

ถ้านายเทียบเปลี่ยนไป language 2.12.12 มันไม่ compile อีกต่อไปแล้ว scastie.scala-lang.org/IIeRtsG1SImlxacl2HzZIA
leozilla

@leozilla ปัญหาเหมือนจะเป็นคนประเภท parameterrs ไม่ inferred. คดีแรกเริ่มต้น(กับ explicit เรียก)สามารถจะช่วยระบุประเภทพารามิเตอร์ scastie.scala-lang.org/DmytroMitin/76yS2AG6SMGDrEZZDC9VdA ปัญหาของคุณไม่สามารถกำหนดพวกเขาอยู่กับส่วนขยายวิธีการ. ฉันเกรงว่าอีกไม่สามารถทำได้ที่นี่ใน 2.12.
Dmytro Mitin

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................