2

我有一个相对符合人体工程学的模式,我用它来匹配无形Coproduct的 s。它看起来基本上是这样的

val stringOrInt: String :+: Int :+: CNil  = Coproduct("Hello world")

implicit class Coproduct2Syntax[A, B](val value: A :+: B :+: CNil) extends AnyVal {
  type cop = A :+: B :+: CNil

  def comatch[Z](
    caseA: PartialFunction[A, Z],
    caseB: PartialFunction[B, Z]
  ): Z = {
    val a = Function.unlift[cop, Z](_.select[A].flatMap(caseA.lift))
    val b = Function.unlift[cop, Z](_.select[B].flatMap(caseB.lift))
    a.orElse(b).apply(value)
  }
}

stringOrInt.comatch({
  case s => s.length
},{
  case i => i
})
// Int = 11

这工作得很好,但我还没有经历定义CoproductNSyntax0-22 的麻烦。

我知道我们可以用 做类似的事情Poly1,但这需要定义一个单独的对象

我的问题是:是否有任何现有的库提供这种类型的模式来匹配Coproducts?

4

0 回答 0