Ich versuche, Shapeless zu lernen, und ich möchte ein Monoid definieren, das Instanzen von formlosen Aufzeichnungen zusammenfügt. Beachten Sie, dass ich Algebird-Monoids (nicht Scalaz) verwende, aber ich bin mir sicher, dass sie sich sehr ähnlich sind. Hier ist ein Beispiel dafür, was Ich mag würde der Lage sein, zu tun:Definieren Sie eine Typklasse für formlose Datensätze
val result = Monoid.sum(
('a ->> 1) :: ('b ->> 1) :: HNil,
('a ->> 4) :: ('b ->> 3) :: HNil,
('a ->> 2) :: ('b ->> 6) :: HNil)
// result should be: ('a ->> 7) :: ('b ->> 10) :: HNil
ich herausgefunden, wie Monoid-Instanzen für hList zu schreiben, wie folgt:
implicit val HNilGroup: Group[HNil] = new ConstantGroup[HNil](HNil)
implicit val HNilMonoid: Monoid[HNil] = HNilGroup
class HListMonoid[H, T <: HList](implicit hmon: Monoid[H], tmon: Monoid[T]) extends Monoid[::[H, T]] {
def zero = hmon.zero :: tmon.zero
def plus(a: ::[H, T], b: ::[H, T]) =
hmon.plus(a.head, b.head) :: tmon.plus(a.tail, b.tail)
}
implicit def hListMonoid[H, T <: HList](implicit hmon: Monoid[H], tmon: Monoid[T]) = new HListMonoid[H, T]
Dies erlaubt mir zu schreiben:
val result = Monoid.sum(
1 :: 1 :: HNil,
4 :: 3 :: HNil,
2 :: 6 :: HNil)
// result is 7 :: 10 :: HNil
Nun, da ich hList Instanzen summieren kann, scheint das fehlende Stück Monoid Instanzen zu definieren, welche Felder der Form summieren können ('name ->> 1)
, die meine IDE sagt mir den folgenden Typ hat: Int with record.KeyTag[Symbol with tag.Tagged[Constant(name).type] { .. }, Int] { .. }
. An dieser Stelle stecke ich fest, da ich einfach nicht weiß, wie ich das machen soll.
Danke für die Hilfe, die erste Lösung hat den Trick für mich. Ich bin mir sicher, dass das zweite Beispiel auch funktioniert, aber ich muss es ein wenig mehr studieren, um es zu verstehen. Ich wollte eigentlich lernen, wie ich Shapeless 'Auto-Typklassen-Ableitung verwenden kann, aber im Moment ist dieser Code ziemlich undurchsichtig für mich. – JimN