即使在无形你需要一些样板,像这样:
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
同构,就像在无形中。 scalaz.typelevel
不(目前)提供这种开箱,但它不应该太难实现,下面无形的一种模式。
是啊,我定居明确定义它们现在;它只是觉得应该有更好的方法。如果没有更好的事情出现,我会接受。 – Hugh
Aparently类型的东西可以在scalaz中做到。我无法正常工作。 –
不成形也做了 - https://github.com/milessabin/shapeless/blob/master/examples/src/main/scala/shapeless/examples/monoids.scala –