Tôi hiện đang triển khai một thư viện để tuần tự hóa và deserialize đến và từ các tin nhắn XML-RPC. Nó gần như đã hoàn tất nhưng bây giờ tôi đang cố gắng loại bỏ bản mẫu của phương pháp asProduct hiện tại của tôi bằng cách sử dụng Shapeless. Mã hiện tại của tôi:Làm thế nào để các lớp vỏ trường hợp không ổn định với các thuộc tính và typeclasses?
trait Serializer[T] {
def serialize(value: T): NodeSeq
}
trait Deserializer[T] {
type Deserialized[T] = Validation[AnyErrors, T]
type AnyErrors = NonEmptyList[AnyError]
def deserialize(from: NodeSeq): Deserialized[T]
}
trait Datatype[T] extends Serializer[T] with Deserializer[T]
// Example of asProduct, there are 20 more methods like this, from arity 1 to 22
def asProduct2[S, T1: Datatype, T2: Datatype](apply: (T1, T2) => S)(unapply: S => Product2[T1, T2]) = new Datatype[S] {
override def serialize(value: S): NodeSeq = {
val params = unapply(value)
val b = toXmlrpc(params._1) ++ toXmlrpc(params._2)
b.theSeq
}
// Using scalaz
override def deserialize(from: NodeSeq): Deserialized[S] = (
fromXmlrpc[T1](from(0)) |@| fromXmlrpc[T2](from(1))
) {apply}
}
Mục tiêu của tôi là cho phép người dùng thư viện sắp xếp/sắp xếp lại các trường hợp không có mã. Hiện tại, bạn phải khai báo lớp case và một val ẩn bằng cách sử dụng phương thức asProduct đã nói ở trên để có một cá thể Datatype trong ngữ cảnh. ngầm này được sử dụng trong đoạn mã sau:
def toXmlrpc[T](datatype: T)(implicit serializer: Serializer[T]): NodeSeq =
serializer.serialize(datatype)
def fromXmlrpc[T](value: NodeSeq)(implicit deserializer: Deserializer[T]): Deserialized[T] =
deserializer.deserialize(value)
Đây là chiến lược kinh điển của serializing và deserializing sử dụng các lớp học kiểu.
Tại thời điểm này, tôi đã nắm được thế nào để chuyển đổi từ trường hợp lớp học để HList qua Generic hoặc LabelledGeneric. Vấn đề là khi tôi thực hiện chuyển đổi này, tôi có thể gọi phương thức từXmlrpc và toXmlrpc như trong ví dụ asProduct2. Tôi không có bất kỳ thông tin nào về các loại thuộc tính trong lớp trường hợp và do đó, trình biên dịch không thể tìm thấy bất kỳ ẩn nào đáp ứng từXmlrpc và toXmlrpc. Tôi cần một cách để hạn chế rằng tất cả các yếu tố của một HList có một kiểu dữ liệu tiềm ẩn trong ngữ cảnh.
Vì tôi là người mới bắt đầu với Shapeless, tôi muốn biết cách tốt nhất để nhận chức năng này là gì. Tôi có một số hiểu biết nhưng tôi chắc chắn không có ý tưởng làm thế nào để làm cho nó được thực hiện bằng cách sử dụng Shapeless. Lý tưởng sẽ có một cách để có được các loại từ một thuộc tính nhất định của lớp trường hợp và thông qua loại hình này một cách rõ ràng để fromXmlrpc và toXmlrpc. Tôi tưởng tượng rằng đây không phải là cách nó có thể được thực hiện.