假设我有一个ADT是这样的:在这种情况下你会使用类型类吗?
sealed trait A extends Product with Serializable
object A {
case class A1() extends A
case class A2() extends A
case class A3() extends A
case class A4() extends A
}
还假设我有一个trait AFoo
这样的:
type Foo = ...
trait AFoo { def asFoo(a: A): Foo }
现在我需要为AFoo
提供两种不同的实现。所以我写这样的东西:
abstract class AFooSupport extends AFoo {
protected def asFoo1(a1: A1): Foo
protected def asFoo2(a2: A2): Foo
protected def asFoo3(a3: A3): Foo
protected def asFoo4(a4: A4): Foo
def asFoo(a: A) = a match {
case a1: A1 => asFoo1(a1)
case a2: A2 => asFoo2(a2)
case a3: A3 => asFoo3(a3)
case a4: A4 => asFoo4(a4)
}
}
class AFoo1 extends AFooSupport {
// implement asFoo1, asFoo2, asFoo3, asFoo4
}
class AFoo2 extends AFooSupport {
// implement asFoo1, asFoo2, asFoo3, asFoo4
}
这种方法可能会工作,但我想知道是否有更好的方法来做到这一点。在这种情况下,你会使用类型的吗?
你确实需要'asFoo'的多个实现吗?对仅适用于单个ADT的操作使用类型类似乎很奇怪。如果你真的想抽象出匹配,那么折叠看起来更合理。 –
我只需要一个'asFoo'的实现。将尝试'折叠',谢谢。 – Michael