2015-07-28 17 views

Trả lời

6

Có thể không có khả năng làm được nhiều việc!

import shapeless._ 
    import syntax.std.tuple._ 

    trait basicOption extends Poly1 { 
    implicit def default[T] = at[T](t => Some(t)) 
    } 

    object fullOption extends basicOption { 
    implicit def caseSome[T] = at[Some[T]](s => s) 
    implicit def caseNone = at[None.type](s => s) 
    } 

    println((Some(1),2,Some(3)).map(fullOption)) // (Some(1),Some(2),Some(3)) 
    println((Some(1),2,None).map(fullOption)) // (Some(1), Some(2), None) 

Để biết thêm ví dụ bạn có thể kiểm tra họ github repo

này là dành cho hình thù 2,0 trở lên, nếu bạn đang sử dụng một cái gì đó lớn tuổi hơn bạn vẫn có thể làm điều đó nhưng thay vì gọi map trên tuple trực tiếp bạn sẽ phải để xem qua số HList.

+1

Câu trả lời hay và bạn đánh bại tôi :-) –

7

Có nó là,

scala> import shapeless._, syntax.std.tuple._ 
import shapeless._ 
import syntax.std.tuple._ 

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

object opt extends opt0 { 
    implicit def optId[T <: Option[_]] = at[T](identity) 
} 
trait opt0 extends Poly1 { 
    implicit def default[T] = at[T](Option(_)) 
} 

// Exiting paste mode, now interpreting. 

defined object opt 
defined trait opt0 

scala> (Some(1), 2, Some(3)) map opt 
res0: (Some[Int], Option[Int], Some[Int]) = (Some(1),Some(2),Some(3)) 

Bạn sẽ nhận thấy rằng Some[Int] 's tại vị trí đầu tiên và cuối cùng đã được bảo quản trong khi các yếu tố giữa nhấc được gõ như Option[Int]. Tôi đã làm việc trên giả định rằng những gì bạn thực sự dự định là một cái gì đó như thế này,

scala> (Option(1), 2, Option(3)) map opt 
res1: (Option[Int], Option[Int], Option[Int]) = (Some(1),Some(2),Some(3)) 
+0

ah +1 for 'T <: Option [ _] 'đẹp hơn nhiều so với giải pháp xấu xí của tôi :-) –

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