2014-09-30 11 views
6

này không biên dịch và tôi không hiểu tại sao:Tại sao ánh xạ trên một HList of Option [T] không hoạt động?

import shapeless._ 
import poly._ 

object option extends (Option ~> List) { 
    def apply[T](t: Option[T]) = t.toList 
} 

val simple = Some(1) :: Some("hello") :: Some(true) :: HNil 
val opts: List[Int] :: List[String] :: List[Boolean] :: HNil = simple map option 

Đây là điều khá ngạc nhiên, bởi vì đây không biên dịch:

import shapeless._ 
import poly._ 

object choose extends (Set ~> Option) { 
    def apply[T](s: Set[T]) = s.headOption 
} 

val sets = Set(1) :: Set("foo") :: HNil 
val opts: Option[Int] :: Option[String] :: HNil = sets map choose 
+0

Vui lòng nói lỗi bạn nhận được. Đừng làm cho nhiều độc giả (đến một nhà văn của bạn) đoán, hoặc phải chạy nó. –

+0

@Paul Thx cho đề xuất. Đó là một phần của một thương mại tắt giữa câu hỏi conciseness (trong đó bao la cải thiện cơ hội ai đó thực sự sẽ trả lời câu hỏi, IMHO) và cung cấp càng nhiều thông tin càng tốt. Có lẽ một ngày, SO sẽ có một trình biên dịch tích hợp và chúng tôi sẽ có tốt nhất của cả hai thế giới (chưa kể đến ít lỗi chính tả trong mã). – jedesah

+2

Er, không, không phải trong trường hợp này. Cung cấp thông báo lỗi là một vài dòng phụ và không làm lộn xộn những gì bạn đã đặt. "không biên dịch" chỉ kém nhẹ hơn so với "khét tiếng" –

Trả lời

6

Vấn đề là việc bạn sử dụng Some thay vì Option. Trình biên dịch phàn nàn rằng nó không thể tìm thấy bất cứ điều gì để chuyển đổi một danh sách các Some s mặc dù Option bản đồ của bạn đang được sử dụng. Để khắc phục điều này, bạn có thể:

Thay đổi xây dựng danh sách đơn giản để sử dụng Option thay vì Some:

object option extends (Option ~> List) { 
    def apply[T](t: Option[T]) = t.toList 
    } 

    val simple = Option(1) :: Option("hello") :: Option(true) :: HNil 
    val opts2: List[Int] :: List[String] :: List[Boolean] :: HNil = simple map option 

Sử dụng Some như loại mapper của bạn:

object option extends (Some ~> List) { 
    def apply[T](t: Some[T]) = t.toList 
    } 

    val simple = Some(1) :: Some("hello") :: Some(true) :: HNil 
    val opts2: List[Int] :: List[String] :: List[Boolean] :: HNil = simple map option 

Hoặc buộc các loại đơn giản bị downcast thành Option:

object option extends (Option ~> List) { 
    def apply[T](t: Option[T]) = t.toList 
    } 

    val simple: Option[Int] :: Option[String] :: Option[Boolean] :: HNil = Some(1) :: Some("hello") :: Some(true) :: HNil 
    val opts2: List[Int] :: List[String] :: List[Boolean] :: HNil = simple map option 
Các vấn đề liên quan