Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 如何以惯用的方式在scala中创建嵌套的toSet?_List_Scala_Set_Nested_Seq - Fatal编程技术网

List 如何以惯用的方式在scala中创建嵌套的toSet?

List 如何以惯用的方式在scala中创建嵌套的toSet?,list,scala,set,nested,seq,List,Scala,Set,Nested,Seq,有没有更惯用的方法将嵌套序列更改为嵌套集合 def toNestedSet[T](tsss: Seq[Seq[Seq[T]]]): Set[Set[Set[T]]] = tsss.map(_.map(_.toSet).toSet).toSet 有没有可能实现一个可以处理任意深度列表的功能?要解决问题的第二部分(处理任意深度列表),类似这样的功能可以工作(类型擦除有点妨碍): 注意:又快又脏——它可以工作,但很容易被破坏:) 编辑:演员阵容是多余的这实际上一点也不糟糕(关于这种方法的一

有没有更惯用的方法将嵌套序列更改为嵌套集合

def toNestedSet[T](tsss: Seq[Seq[Seq[T]]]): Set[Set[Set[T]]]  = 
   tsss.map(_.map(_.toSet).toSet).toSet

有没有可能实现一个可以处理任意深度列表的功能?

要解决问题的第二部分(处理任意深度列表),类似这样的功能可以工作(类型擦除有点妨碍):

注意:又快又脏——它可以工作,但很容易被破坏:)


编辑:演员阵容是多余的

这实际上一点也不糟糕(关于这种方法的一些额外讨论,请参阅类似问题):

静态键入为
Set[Set[Set[Set[[Int]]]]
和全部


嗯,我撒了一点谎。
我其实更喜欢op的解决方案:)op的解决方案不适用于任意深度的Seq。如果深度已知,那么是的-这就是方法。我不会说类型擦除“妨碍”太多类型擦除使得在模式匹配中对类型进行调度几乎和应该的一样令人不快“。完全有可能以类型安全的方式执行此操作,而无需任何
any
或强制转换。例如,请参见类似问题的解决方案。您的问题稍微复杂一点,但我100%相信该方法会起作用。我的第一个想法是“也许Shapess可以处理任意嵌套Seq以设置的一般问题?”()当我发现自己处于这种情况时,我通常会为一个或多个内部嵌套创建一个类型定义,但无论如何我都需要大量重用。@RandallSchulz:我想不出一种方法,Shapeless会比Shapeless实现(比如)简单得多.也许我错了,例如,可能有某种方法可以让SYB做到这一点,但我目前还没有看到。好吧,这很聪明。我在工作中遇到了一个问题,涉及到一个比OP更复杂的递归数据结构,我目前正在使用下面答案的更复杂变体处理OP(我从来没有真正满意过).我可能会尝试对此进行修改:)一个脚注:为了清晰起见,我忽略了差异问题,这意味着只有当序列静态键入为
Seq
时,此版本才会起作用。这并不难“修复”这只是有点混乱。嗨,我喜欢这两个答案,但是James Adam提供的答案解决了问题,而且仍然很简单。这就是为什么我接受了他的答案。但是,对于高级应用程序和用户来说,您的答案可能更方便+1@goozez:很公平,但我要指出的是,丢失类型信息意味着您必须强制转换结果,这就消除了在任意嵌套中立即实现此功能的许多优点。@TravisBrown nsubAmbig2中是否有错误?它看起来与nsubAmbig1完全相同。
  def toNestedSet(ts: Seq[Any]): Set[Any] = {
    ts.foldLeft[Set[Any]](Set())((acc, b) => b match {
        case s: Seq[_] => acc + toNestedSet(s)
        case x => acc + x
    })
  } 
trait Setsifier[I, O] { def apply(i: I): O }

object Setsifier {
  def apply[I, O](f: I => O) = new Setsifier[I, O] { def apply(i: I) = f(i) }

  implicit def base[I](implicit ev: I <:!< Seq[_]) = apply((_: Seq[I]).toSet)

  implicit def rec[I, O](implicit s: Setsifier[I, O]) =
    apply((_: Seq[I]).map(s(_)).toSet)
}

def setsify[I, O](i: I)(implicit s: Setsifier[I, O]) = s(i)
scala> println(setsify(Seq(Seq(Seq(Seq(1)), Seq(Seq(2, 3))))))
Set(Set(Set(Set(1)), Set(Set(2, 3))))
trait <:!<[A, B]

implicit def nsub[A, B] : A <:!< B = new <:!<[A, B] {}
implicit def nsubAmbig1[A, B >: A] : A <:!< B = sys.error("Don't call this!")
implicit def nsubAmbig2[A, B >: A] : A <:!< B = sys.error("Don't call this!")