首页 > 解决方案 > scala 将集合组合为一维集合

问题描述

我想获得像 R 语言的功能这样的c功能:

#R
print(c(c(1,2,3),2,3,c(1,2)))
> c(1,2,3,2,3,1,2)

我的解决方案是


trait SeqMagnet[A] {
  type Result = Seq[A]

  def apply(): Result
}

object SeqMagnet {

  implicit class fromString(x: String) extends SeqMagnet[String] {
    override type Result = Seq[String]

    override def apply(): Result = Seq(x)
  }

  implicit class fromInt(x: Int) extends SeqMagnet[Int] {
    override type Result = Seq[Int]

    override def apply(): Result = Seq(x)
  }

  implicit class fromDouble(x: Double) extends SeqMagnet[Double] {
    override type Result = Seq[Double]

    override def apply(): Result = Seq(x)
  }

  implicit class fromSeq(x: TraversableOnce[_]) extends SeqMagnet[_] {
    override type Result = Seq[_]

    override def apply(): Result = x.toSeq
  }

}


object Combine {
  def toSeq(magnet: SeqMagnet[_]) = magnet()

  def c(any: SeqMagnet[_]*) = {
    any.map(toSeq(_)).flatten
  }
}

但我seq[Any] 从这个函数中得到了一些错误,fromSeqCLASS

我的预期是这样的

# pseudo-code
def c[A](A( or A collections)*):Seq[A] 
----
input: Int Seq(1,2,3) ,seq(4,5)
output: Seq(1,2,3,4,5):Seq[Int]
----
input: String Seq("a",b"), "d",seq("c","e")
output: Seq("a","b","d","c","e")

我的斯卡拉版本是 2.11

标签: rscalacollections

解决方案


您需要使用类型参数,就像您在伪代码中显示的那样。

import scala.language.implicitConversions

object c {
  private trait CMagnet[+A] {
    def get: Seq[A]
  }
  
  private object CMagnet {
    implicit def fromPlainValue[A](a: A): CMagnet[A] = new CMagnet[A] {
      def get: Seq[A] = a :: Nil
    }
    
    implicit def fromSeq[A](seq: Seq[A]): CMagnet[A] = new CMagnet[A] {
      def get: Seq[A] = seq
    }
  }
  
  def apply[A](args: CMagnet[A]*): Seq[A] =
    args.flatMap(_.get)
}

你可以像这样使用它:

val seq = Seq("A", "B")
val result = c(seq, "C", "D", Seq("E", "F", "G"), "H")
// result: Seq[String] = ArraySeq(A, B, C, D, E, F, G, H)

或者像这样:

val seq = c("A", "B")
val result = c(seq, "C", "D", c("E", c("F", "G")), "H")
// result: Seq[String] = ArraySeq(A, B, C, D, E, F, G, H)

我说最好避免这种情况的原因是它需要大量(高级)代码来编写一些人可能认为没那么有用的东西,但如果你需要它,你就去吧。


您可以看到这里运行的代码。


推荐阅读