Cóhình thù: ánh xạ một tuple với một số tùy chọn để lựa chọn
(Some(1), 2, Some(3))
tôi mong muốn nhận được
(Some(1), Some(2), Some(3))
Với hình thù là nó có thể làm như vậy?
Cóhình thù: ánh xạ một tuple với một số tùy chọn để lựa chọn
(Some(1), 2, Some(3))
tôi mong muốn nhận được
(Some(1), Some(2), Some(3))
Với hình thù là nó có thể làm như vậy?
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
.
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))
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âu trả lời hay và bạn đánh bại tôi :-) –