[英]Map tuple to tuple in Scala
I want to map a pair of options of String like the following 我想映射String的一对选项,如下所示
val pair: (Option[String], Option[String]) = (Some("a"), None)
val mapped: (String, String) = pair map {case (a:Option[String],b:Option[String]) => (a.getOrElse(""),b.getOrElse(""))}
but the output signature is different from what I expected 但是输出签名与我预期的不同
(Option[String],(String,String))
It seems that I'm missing something here... maybe scalaz or shapeless allows for such functionality of mapping tuples? 似乎我在这里丢失了某些东西……也许是scalaz或shapeless允许这种映射元组的功能?
Simple change from map
to match
you'll get expected types. 从map
进行简单更改即可match
您所期望的类型。
scala> val pair: (Option[String], Option[String]) = (Some("a"), None)
pair: (Option[String], Option[String]) = (Some(a),None)
scala>
scala> val mapped: (String, String) = pair match {case (a:Option[String],b:Option[String]) => (a.getOrElse(""),b.getOrElse(""))}
mapped: (String, String) = (a,"")
scala>
scala> mapped
res8: (String, String) = (a,"")
In case if you specifically want to do things like that with shapeless , you should make some preparations. 如果您特别想使用shapeless进行此类操作,则应做好一些准备。
First tell your compiler what you want to use in case of None
: 首先,告诉您的编译器在None
情况下要使用什么:
class Default[T](val value: T)
implicit object defaultString extends Default[String]("")
Now create your function to map
: 现在创建要map
的函数:
import shapeless._
object extract extends Poly1 {
implicit def withDefault[T](implicit default: Default[T]) =
at[Option[T]](_ getOrElse default.value)
}
Now use shapeless extension for tuples : 现在对元组使用无形扩展 :
import syntax.std.tuple._
pair.map(extract) // res0: (String, String) = (a,)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.