Próbuję nauczyć się Shapeless i chciałbym zdefiniować monoid, który dodaje instancje bezkształtnych rekordów. Zauważ, że używam mono-algeberów (nie scalaz), ale jestem pewien, że są całkiem podobne. Oto przykład tego, co chciałbym być w stanie to zrobić:Definiowanie Typeclass for Shapeless Records
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
zorientowali się, jak napisać monoid instancje dla HList, co następuje:
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]
To pozwala mi pisać:
val result = Monoid.sum(
1 :: 1 :: HNil,
4 :: 3 :: HNil,
2 :: 6 :: HNil)
// result is 7 :: 10 :: HNil
teraz mogę podsumować HList instancji, brakujący kawałek wydaje się definiowanie instancji monoid który może liczyć pól formularza ('name ->> 1)
, co mówi mi mój IDE posiada następujące rodzaje: Int with record.KeyTag[Symbol with tag.Tagged[Constant(name).type] { .. }, Int] { .. }
. W tym momencie utknąłem, ponieważ po prostu nie wiem, jak to zrobić.
Dzięki za pomoc, pierwsze rozwiązanie mi pomogło. Jestem pewien, że drugi przykład też działa, ale muszę go trochę przestudiować, żeby to zrozumieć. Chciałam spróbować nauczyć się używać metody "bezkształtnej" wyprowadzki z automatycznej typografii, ale na razie ten kod jest dla mnie dość nieprzejrzysty. – JimN