简体   繁体   English

将元组映射到Scala中的元组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM