我有一个相对符合人体工程学的模式,我用它来匹配无形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
这工作得很好,但我还没有经历定义CoproductNSyntax
0-22 的麻烦。
我知道我们可以用 做类似的事情Poly1
,但这需要定义一个单独的对象
我的问题是:是否有任何现有的库提供这种类型的模式来匹配Coproduct
s?