具有部分功能的模式匹配无形副产品的库

时间:2019-06-08 00:20:18

标签: scala generic-programming shapeless coproduct

我有一个相对人机工程学样式,用于匹配无形状的Coproduct。基本上看起来像这样

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

这很好用,但是我没有为0定义CoproductNSyntax的麻烦。

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

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

0 个答案:

没有答案