小编Kan*_*ane的帖子

Scala:为什么mapValues会生成一个视图,是否有任何稳定的替代方案?

刚才我很惊讶地发现了mapValues一个视图.结果如下例所示:

case class thing(id: Int)
val rand = new java.util.Random
val distribution = Map(thing(0) -> 0.5, thing(1) -> 0.5)
val perturbed = distribution mapValues { _ + 0.1 * rand.nextGaussian }
val sumProbs = perturbed.map{_._2}.sum
val newDistribution = perturbed mapValues { _ / sumProbs }
Run Code Online (Sandbox Code Playgroud)

我的想法是,我有一个分布,它有一些随机性,然后我重新规范它.代码实际上失败了它的初衷:因为mapValues生成a view,_ + 0.1 * rand.nextGaussian总是在perturbed使用时重新评估.

我现在正在做类似的事情distribution map { case (s, p) => (s, p + 0.1 * rand.nextGaussian) },但这只是一点点冗长.所以这个问题的目的是:

  1. 提醒那些不了解这一事实的人.
  2. 寻找他们mapValues输出 …

scala map

59
推荐指数
2
解决办法
4338
查看次数

Scala:抽象类构造函数参数vs Trait val成员?

我注意到有几个关于如何在抽象类和特征之间进行选择的讨论,但似乎没有一个关注于以下几点.让我使用抽象类的一个原因是,它们可以有构造函数参数,而特征却不能.但为什么不是以下

trait X {
  def haha: Int
}
class Y(val haha: Int) extends X
Run Code Online (Sandbox Code Playgroud)

甚至不需要早期定义来使一切正常工作(我担心).抽象类版本是

abstract class X(haha: Int)
class Y(val haha: Int) extends X(haha)
Run Code Online (Sandbox Code Playgroud)

而且我不喜欢抽象类版本,因为当你多次扩展时,这些构造函数参数出现在任何地方(也许有人告诉我如何避免这种情况?).

我知道抽象类可以更好地插入Java,并且更符合"is-a"概念.尽管如此,我是否有理由在某处使用抽象类?谢谢!

abstract-class scala traits

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

在Scala中使用可变长度索引的"update"方法

我正在编写类似于具有可变维度的数组的代码.我所做的是维护线性底层集合并使用索引访问方法将其包装起来.由于数据结构的维度未知,我写的是类似的东西

def apply(i: Int*): Double = ...
Run Code Online (Sandbox Code Playgroud)

而且效果很好.但是,我不能做同样的事情更新方法和运算符,如+ =,所以我最终写的方法,如

def set(v: Double, i: Int*) ...
def add(v: Double, i: Int*) ...
Run Code Online (Sandbox Code Playgroud)

这很好,但不是我真正想要的.我想有关更新的问题可以通过两种方式解决:

  1. 在更新函数中更改参数的顺序,这使它看起来很奇怪.
  2. 允许可变长度参数不是最后一个.我发现这个问题在一般设置中提出,可以通过使用currying函数来解决,这里不适用.

关于+ =的问题似乎更复杂,甚至在索引具有固定长度时也存在.也许我们可以添加一个具有+ =运算符的对象并使用this(...)来获取对象(这样(...)+ = v将调用我们期望的某个方法),但这会与申请方法.

如果有人对上述任何问题有解决方案或有理由说我们不能编写这样的代码,请分享您的想法!谢谢〜

scala variadic-functions shapeless

6
推荐指数
2
解决办法
727
查看次数

Scala:不可变性和路径依赖类型兼容性

我已经围绕这个主题提出了几个问题,但这次我想进行更一般的讨论,因为在我看来,Scala缺少一些非常重要的块.

考虑以下代码(从我的实际项目中简化),

trait World {
  type State <: StateIntf
  def evolve(s: State): State
  def initialState: State
}

class Algorithm(world: World) {
  def process(s: world.State) {
    val s1 = world.evolve(s)
    // ... do something with s and s1
  }
}
Run Code Online (Sandbox Code Playgroud)

一切看起来都很美丽和数学,但是

object SomeWorld extends World {...}
new Algorithm(SomeWorld).process(SomeWorld.initialState)  // incompatible type
Run Code Online (Sandbox Code Playgroud)

当然你可以用以下方式做

trait World {
  type State <: StateIntf
  var s: State
  def evolve: Unit      // s = next state
  def initialize: Unit  // s = initial state
  def getState: StateIntf …
Run Code Online (Sandbox Code Playgroud)

scala path-dependent-type

4
推荐指数
2
解决办法
310
查看次数

模式匹配scala中的常量表达式?

是否可以重写以下代码

for (i <- x) {
  if (i==x.first) {
    // do sth
  } else if (i==x.last) {
    // do sth
  } else {
    // do sth
  }
}
Run Code Online (Sandbox Code Playgroud)

使用模式匹配

for (i <- x) i match { 
  case `x.first` => // do sth
  case `x.last` => // do sth
  case _ => // do sth
}
Run Code Online (Sandbox Code Playgroud)

我知道我们可以使用保护,或评估x.firstx.last提前将它们存储在其他vals到这里引用,但是这只是丑陋.有任何想法吗?谢谢!

scala pattern-matching

2
推荐指数
1
解决办法
101
查看次数