小编par*_*tic的帖子

通用数据结构的默认值

我想写一个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)

generics scala default-value

7
推荐指数
2
解决办法
5028
查看次数

对期货做出反应

我试图使用分而治之(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 future actor

7
推荐指数
1
解决办法
701
查看次数

在Scala中使用创造性和有用的运算符的示例

在与朋友讨论操作员重载之后.我正在研究Scala中运算符重载的创造性和/或有用的示例用法.我有一些很酷的插图:

  • 数学结构,如线性代数或复数(+ * -)
  • 模仿shell管道和重定向(| > < >>)
  • 语法中的替代表达式(|)

你有其他好的例子吗?

scala operator-overloading

7
推荐指数
1
解决办法
343
查看次数

双折的功能模式

让玩具类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)

design-patterns functional-programming scala

7
推荐指数
1
解决办法
416
查看次数

Scala中的条件编译

我正在开发一个依赖于Scala 2.9的库,但仅限于一个小功能.我想提出与2.8兼容的版本,但我不想维护两个代码分支.由于我正在使用SBT,我希望从它的交叉编译功能中受益.

但是我不知道有没有办法提供等效的条件编译,只有在使用Scala 2.9时才包含一段代码.反身性可能是一种选择(但如何?).

编辑:我在2.9中使用的功能是新的sys包对象.

scala sbt

6
推荐指数
1
解决办法
1231
查看次数

使用Akka Futures生成并行随机数

我正在编写一个使用Akka 2 Futures构建的CPU密集型应用程序.我目前不需要Actors,但我不是不愿意使用它们.

期货中包含的几个计算必须经常调用随机生成器.我担心如果我使用经典的并发RNG,它将成为一个窒息点,我将失去可扩展性.

在每个线程中使用随机生成器的最快/最简单的方法是ExecutionContext什么?

有没有办法用不同的种子(但事先知道)初始化它们这样重复实验?

random scala future akka

6
推荐指数
1
解决办法
909
查看次数

在特征中使用@specialized

我有一个特点和实现看起来像:

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注释AB避免自动装箱.我是否需要在特征和实现中使用它,仅在实现中使用它,或仅在特征中使用它?

autoboxing scala specialization

6
推荐指数
1
解决办法
552
查看次数

使用类型系统将整数转换为peano数

这是我差不多两年前提出一个问题的后续问题.我还在尝试使用类型系统来编写一个小的线性代数库,其中矢量/矩阵/张量的维度使用类型系统进行编码(使用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具有依赖类型和宏.有没有办法实现它?

scala type-level-computation peano-numbers

6
推荐指数
1
解决办法
678
查看次数

避免与Cake Pattern名称冲突

我目前正在使用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和 …

scala traits name-clash cake-pattern

6
推荐指数
1
解决办法
623
查看次数

Spray Client Post Multipart

我想使用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 multipartform-data spray spray-client

6
推荐指数
1
解决办法
3108
查看次数