如何将List[List[Int]]的内部元素转换为元组?(如何展平多态元组)

如何将List[List[Int]]的内部元素转换为元组?(如何展平多态元组),list,scala,functional-programming,extract,flatten,List,Scala,Functional Programming,Extract,Flatten,我想转换多个列表,每个列表的内部列表大小不变,如下所示: List(List(1, 2, 3), List(3, 4, 5)) List(List(1, 2), List(3, 4)) list2tup[(Int,Int),Int](List(List(1,2),List(2,3))) 为此: List((1, 2, 3), (3, 4, 5)) List((1, 2), (3, 4)) 因此,如果val q:List[List[Int]=List(List

我想转换多个列表,每个列表的内部列表大小不变,如下所示:

    List(List(1, 2, 3), List(3, 4, 5))
    List(List(1, 2), List(3, 4))
list2tup[(Int,Int),Int](List(List(1,2),List(2,3)))
为此:

    List((1, 2, 3), (3, 4, 5))
    List((1, 2), (3, 4))
因此,如果
val q:List[List[Int]=List(List(1,2,3),List(3,4,5)
,可以尝试以下方法:

    q.map(_.collect { case a :: b => (a,b) })
对于3元素列表示例,这为您提供了以下形式:

    List((1, List(2, 3)), (3, List(4, 5)))
我无法展平元组,因为它们包含两种类型:Int和List[Int],因此无法根据需要将
(1,List(2,3))
转换为
(1,2,3)

那么,我如何扩展展平函数来实现这一点,或者在scala中有更好的方法来实现这一点吗?scalaz有什么帮助吗


tl;dr:如何将列表的内部列表转换为元组?(可能的广义问题:如何展平多态元组?

您可以使用隐式执行类似操作:

trait TupOps[T,I] {
  val size: Int
  def fromList(vals: List[I]): T
}

def list2tup[T,I](vals: List[List[I]])(implicit to: TupOps[T,I]) = {
  if (!vals.forall(_.size == to.size)) sys.error("wrong list size")
  else vals.map(to.fromList _)
}

implicit def tup2ops[I] = new TupOps[(I,I),I] {
  val size = 2
  def fromList(v: List[I]) = (v(0), v(1))
}

implicit def tup3ops[I] = new TupOps[(I,I,I),I] {
  val size = 3
  def fromList(v: List[I]) = (v(0), v(1), v(2))
}
这样调用:

    List(List(1, 2, 3), List(3, 4, 5))
    List(List(1, 2), List(3, 4))
list2tup[(Int,Int),Int](List(List(1,2),List(2,3)))
但这并不一定更好,特别是因为您必须第二次编写
Int
,这是一个语法限制,因为您不能给出一种类型并告诉编译器推断另一种类型

更新

如果您显式地传递隐式表达式,看起来会更好:

list2tup(List(List(1,2),List(2,3)))(tup2ops)

List(List(1,2,3))map{case List(a,b,c)=>(a,b,c)}
有什么问题吗?一个常规是很困难的,因为在编译时列表的长度是未知的。也许你可以使用shapess'
HList
它可能对shapess做一些有趣的事情,但不管它是否值得(与上文@sschaef的建议相关)这在很大程度上取决于你想对结果做什么,以及你是否真的需要多态性而不是算术。那么你能给我们展示一些上下文吗?你是对的。我认为这很有趣,可能有一个简单的方法,但我想不可以。我甚至不知道为什么我首先想要元组而不是逻辑选择列表。谢谢.