我想写一个SparseVector[T]类,其中T可以是double,int或boolean.
该类不会被数组支持(因为我想要一个稀疏的数据结构),但我已经看到,当我构建一个AnyVal类型的空数组时,元素被初始化为默认值.例如:
scala> new Array[Int](10)
res0: Array[Int] = Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
scala> new Array[Boolean](10)
res1: Array[Boolean] = Array(false, false, false, false, false, false, false, false, false, false)
scala> new Array[Double](10)
res2: Array[Double] = Array(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)
Run Code Online (Sandbox Code Playgroud)
如何在班级中包含此默认值?我想要的行为是:
val v = new SparseVector[Double](100)
println( v(12) ) // should print '0.0'
val w = new SparseVector[Boolean](100)
println( v(85) ) // should print …Run Code Online (Sandbox Code Playgroud) 我试图使用分而治之(aka fork/join)方法来解决数字运算问题.这是代码:
import scala.actors.Futures.future
private def compute( input: Input ):Result = {
if( pairs.size < SIZE_LIMIT ) {
computeSequential()
} else {
val (input1,input2) = input.split
val f1 = future( compute(input1) )
val f2 = future( compute(input2) )
val result1 = f1()
val result2 = f2()
merge(result1,result2)
}
}
Run Code Online (Sandbox Code Playgroud)
它运行(具有良好的加速)但未来的apply方法似乎阻塞了一个线程,并且线程池大大增加.并且当创建太多线程时,计算被卡住.
是否存在一种释放线程的期货反应方法?或任何其他方式来实现这种行为?
编辑:我使用scala 2.8.0.final
在与朋友讨论操作员重载之后.我正在研究Scala中运算符重载的创造性和/或有用的示例用法.我有一些很酷的插图:
+ * -)| > < >>)|)你有其他好的例子吗?
让玩具类Counter如:
class Counter private( val next: Int, val str2int: Map[String,Int] ) {
def apply( str: String ): (Int,Counter) = str2int get str match {
case Some(i) => ( i, this )
case None => ( next, new Counter( next+1, str2int + (str -> next) ) )
}
}
object Counter {
def apply() = new Counter( 0, Map() )
}
Run Code Online (Sandbox Code Playgroud)
此类提供String和自然数之间的映射,每次查询新String时,映射都会延迟扩展.
然后,我可以编写一个方法,可以在Iq的Seq中转换字符串的Seq,在遍历期间更新映射.我得到的第一个实现是foldLeft:
def toInt( strs: Seq[String], counter: Counter ): ( Seq[Int], Counter ) =
strs.foldLeft( (Seq[Int](), …Run Code Online (Sandbox Code Playgroud) 我正在开发一个依赖于Scala 2.9的库,但仅限于一个小功能.我想提出与2.8兼容的版本,但我不想维护两个代码分支.由于我正在使用SBT,我希望从它的交叉编译功能中受益.
但是我不知道有没有办法提供等效的条件编译,只有在使用Scala 2.9时才包含一段代码.反身性可能是一种选择(但如何?).
编辑:我在2.9中使用的功能是新的sys包对象.
我正在编写一个使用Akka 2 Futures构建的CPU密集型应用程序.我目前不需要Actors,但我不是不愿意使用它们.
期货中包含的几个计算必须经常调用随机生成器.我担心如果我使用经典的并发RNG,它将成为一个窒息点,我将失去可扩展性.
在每个线程中使用随机生成器的最快/最简单的方法是ExecutionContext什么?
有没有办法用不同的种子(但事先知道)初始化它们这样重复实验?
我有一个特点和实现看起来像:
trait Foo[A] {
def bar[B >: A: Ordering]: Foo[B]
}
class FooImpl[A]( val a: A, val values: List[Foo[A]] ) extends Foo[A] {
def bar[B >: A] = { /* concrete implementation */}
}
Run Code Online (Sandbox Code Playgroud)
我想使用@specialized注释A并B避免自动装箱.我是否需要在特征和实现中使用它,仅在实现中使用它,或仅在特征中使用它?
这是我差不多两年前提出的一个问题的后续问题.我还在尝试使用类型系统来编写一个小的线性代数库,其中矢量/矩阵/张量的维度使用类型系统进行编码(使用Peano编号).这允许编译器将二进制操作限制为相应维度的对象.
它运行良好,但我必须手动指定每个维度类型.例如(使用无形自然数):
type _1 = Succ[Nat._0]
type _2 = Succ[_1]
type _3 = Succ[_2]
Run Code Online (Sandbox Code Playgroud)
它适用于小尺寸,但如果我需要定义尺寸,它会变得无聊_1024.我正在尝试(没有成功)找到一种方法将(在编译时)整数文字转换为相应的Peano-number类型.
在Daniel Sobral回答评论时,我被告知这是不可能的,因为Scala不支持依赖类型.现在,Scala 2.10具有依赖类型和宏.有没有办法实现它?
我目前正在使用Cake Pattern来实现一些优化算法.我经常遇到名字碰撞问题.例如:
trait Add[T] { this: Foo[T] =>
def constant: T
def plus( t1: T, t2: T ): T
def add( t: T ) = plus( t, constant )
}
trait Mul[T] { this: Bar[T] =>
def constant: T
def times( t1: T, t2: T ): T
def mul( t: T ) = times( t, constant )
}
trait Operations[T] { this: Add[T] with Mul[T] =>
def neg( t: T ): T
}
Run Code Online (Sandbox Code Playgroud)
这里,constant在两者Add和 …
我想使用Spray将多部分表单发布到服务器.特别是我想张贴一张图片.
我遇到麻烦的是文件到多部分的编组.尽管在Spray中他们提到了默认的Marshaller,但我似乎无法将两者结合在一起.
我目前正在使用Spray 1.0-M7,因为我没有迁移到Scala 2.10,如果示例可以符合该分支,那将是非常好的.
我现在拥有的是:
val bis = new BufferedInputStream(new FileInputStream(file))
val bArray = Stream.continually(bis.read).takeWhile(-1 !=).map(_.toByte).toArray
Logger.error("About to post with spray")
pipeline(Post("/saveImageWithSpray", bArray))
Run Code Online (Sandbox Code Playgroud)
当然,我得到一个错误说:
For request 'POST /saveImageWithSpray' [Missing boundary header]
Run Code Online (Sandbox Code Playgroud)
我找到的大多数示例使用内容(作为[X])指令进行编组,但我没有使用Spray-routing,我只需要在另一个框架上构建的应用程序中使用spray-client执行post.
谢谢
编辑
我实际上设法像这样编组:
val pipeline = (
addHeader("Content-Type", "multipart/form-data")
~> sendReceive(conduit)
)
val bis = new BufferedInputStream(new FileInputStream(file, "UTF-8"))
val bArray = Stream.continually(bis.read).takeWhile(-1 !=).map(_.toByte).toArray
Logger.error("About to post with spray "+bArray.length.toString)
pipeline(Post("/saveImageWithSpray", MultipartFormData(Map(
"spray-file" -> BodyPart(
HttpEntity(Some(HttpBody(ContentType(MediaTypes.`image/gif`), bArray))),
HttpHeaders.`Content-Disposition`("form-data", Map("name" -> "spray-file","filename"->"Fuurin (Glass Wind Chime).gif"))::Nil
)
))))
Run Code Online (Sandbox Code Playgroud)
不幸的是,这仍然没有工作,数据正在转移,但服务器无法找到该文件. …
scala ×10
future ×2
actor ×1
akka ×1
autoboxing ×1
cake-pattern ×1
generics ×1
name-clash ×1
random ×1
sbt ×1
spray ×1
spray-client ×1
traits ×1