2012-07-11 31 views
6

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 đồ?

Trả lời

10

Có một sửa chữa dễ dàng: chỉ cần xác định chức năng của bạn như một object thay vì một val:

object f extends (({ type O2[+A] = (Option[A], Option[A]) })#O2 ~> Option) { 
    def apply[A](x: (Option[A], Option[A])): Option[A] = x._1 orElse x._2 
} 

(Lưu ý rằng tôi đã đặt tên chức năng f thay vì mapper để tránh nhầm lẫn với mapper tranh luận ngầm để map.)

tôi không chắc tôi có thể giúp với tại sao -Tại một số điểm tôi đã cố gắng để làm việc ra các chi tiết về lý do tại sao val sẽ không làm việc cho loại điều trong hình thù, và tôi không nhớ tôi đã đi được bao xa.

+8

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. –

Các vấn đề liên quan