Tôi đã cố gắng giải quyết this problem với hình dạng không có hình dạng. Tuy nhiên tôi vì lý do nào đó không thể lập bản đồ trên HList
. Tôi sẽ để cho mã nói cho chính nó.Không thể lập bản đồ trên HList
import shapeless._
import HList._
case class Foo(a: Option[Int], b: Option[Int])
val a = Foo(Some(3), None)
val b = Foo(Some(22), Some(1))
implicit val fooIso = HListIso(Foo.apply _, Foo.unapply _)
val mapper = new (({ type O2[+A] = (Option[A], Option[A]) })#O2 ~> Option) {
def apply[A](x: (Option[A], Option[A])): Option[A] = x._1.orElse(x._2)
}
fooIso.fromHList(fooIso.toHList(a).zip(fooIso.toHList(b)).map(mapper))
Thông báo lỗi là:
<console>:55: error: could not find implicit value for parameter mapper: shapeless.Mapper[java.lang.Object with shapeless.~>[[+A](Option[A], Option[A]),Option],shapeless.::[(Option[Int], Option[Int]),shapeless.::[(Option[Int], Option[Int]),shapeless.HNil]]]
fooIso.fromHList(fooIso.toHList(a).zip(fooIso.toHList(b)).map(mapper))
^
Tại sao không phải là công việc lập bản đồ?
Việc triển khai Poly1 (và do đó ~>) phụ thuộc vào việc có thể đặt tên kiểu đơn lẻ tương ứng với thực thể giống như hàm được xác định, vì nó đang được xác định. Điều này diễn ra suôn sẻ khi thực thể đó là một đối tượng và giá trị được khởi tạo đồng thời với việc tạo ra một định danh ổn định; nhưng không quá trơn tru khi hai người đó tách biệt nhau (instantiation thông qua một cái mới rõ ràng và tạo ra một định danh ổn định thông qua định nghĩa val). Điều này làm cho một số loại ý nghĩa, nhưng tôi không thể chỉ để văn bản biện minh trong spec ... nếu bất cứ ai khác có thể, xin vui lòng cho tôi biết. –