は、私はこのようなADT持っていると仮定します。この場合、タイプクラスを使用しますか?
type Foo = ...
trait AFoo { def asFoo(a: A): Foo }
今私はAFoo
ための2つの異なる実装を提供する必要があります。
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
を持っているにもあるとします。だから私はそのようなことを書いています:
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