即使在 Shapeless 中,您也需要一些样板文件,如下所示:
implicit def fooIso = Iso.hlist(Foo.apply _, Foo.unapply _)
我们可以在 Scalaz 7 中做类似的事情(虽然不那么优雅)。首先对于一些通用机械:
import scalaz._, Scalaz._, Isomorphism._
case class MonoidFromIsorphism[F, G](iso: F <=> G)(
implicit val G: Monoid[G]
) extends IsomorphismMonoid[F, G]
现在我们可以写:
case class Foo(x: Int, y: String)
implicit object fooMonoid extends MonoidFromIsorphism(
new IsoSet[Foo, (Int, String)] {
def to = (Foo.unapply _) andThen (_.get)
def from = (Foo.apply _).tupled
}
)
哪个有效:
scala> mzero[Foo]
res0: Foo = Foo(0,)
这种方法仍然需要你重复类型,它并不比Foo
手动写出实例更简洁(实际上,如果你计算MonoidFromIsomorphism
定义,它就不那么简洁了,但对我来说,这感觉就像是真正应该做的方便的事情在图书馆)。
缺少的是HList
-tuple 同构,它允许我们编写一个简单的Foo
-HList
同构,就像在 Shapeless 中一样。scalaz.typelevel
(目前)不提供开箱即用的功能,但按照 Shapeless 作为模型,实施起来应该不会太难。