Shapeless'ı öğrenmeye çalışıyorum ve birlikte olmayan kayıt örneklerini ekleyen bir monoid tanımlamak istiyorum. Algebird monoids (scalaz değil) kullandığımı unutmayın, ama eminim ki oldukça benzerler. aşağıdaki gibiShapeless Records için bir Tipeclass tanımlayın
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
Ben hList için monoid örneklerini yazmak için nasıl düşündüm: Bu veriyor
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]
yazmamı: İşte yapabilmek ne istiyorsunuz bir örnek
Ben hList örneklerini özetleyebilirim olduğunu Şimdival result = Monoid.sum(
1 :: 1 :: HNil,
4 :: 3 :: HNil,
2 :: 6 :: HNil)
// result is 7 :: 10 :: HNil
, eksik parçası benim IDE bana şu türe sahip söyler formu ('name ->> 1)
, alanlarını özetleyebilirim monoid örneklerini tanımlayan gibi görünüyor: Int with record.KeyTag[Symbol with tag.Tagged[Constant(name).type] { .. }, Int] { .. }
. Bu noktada sıkışıp kaldım, çünkü bunu nasıl yapacağımı bilmiyorum.
Yardımın için teşekkürler, ilk çözüm benim için hile yaptı. Eminim ikinci örnek de çalışır, ama bunu anlamak için biraz daha araştırmam gerekecek. Shapeless 'auto typeclass türevini kullanmayı öğrenmeye çalışıyorum, ama şimdilik bu kod benim için oldukça opak. – JimN