r - 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]
从这个函数中得到了一些错误,fromSeq
CLASS
我的预期是这样的
# 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
解决方案
您需要使用类型参数,就像您在伪代码中显示的那样。
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)
我说最好避免这种情况的原因是它需要大量(高级)代码来编写一些人可能认为没那么有用的东西,但如果你需要它,你就去吧。
您可以看到这里运行的代码。
推荐阅读
- android - ViewPager2:setOnTouchListener() 不调用
- r - 如何根据闪亮的动作按钮的输出更新下拉列表?
- python - 从给定的索引和索引的某些条目的值创建 pd.Series
- ios - 不使用 Xcode 的 Flutter 项目中 iOS 的文件夹参考
- spring - 如何在aws中部署spring应用程序?
- c# - 如何验证其 CA 证书和中间证书仅在线可用的证书链
- asp.net-mvc - 是否可以将我在 Internet 上的网站连接到我的本地 SQL Server 数据库?
- python - Tensorflow 2.0 beta 没有属性 keras
- sms - 如何为 Twilio SMS 设置时区?
- javascript - 在 reducer 中更新数组项