即使在無形你需要一些樣板,像這樣:
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 –