刚才我很惊讶地发现了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) },但这只是一点点冗长.所以这个问题的目的是:
mapValues输出 …我注意到有几个关于如何在抽象类和特征之间进行选择的讨论,但似乎没有一个关注于以下几点.让我使用抽象类的一个原因是,它们可以有构造函数参数,而特征却不能.但为什么不是以下
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"概念.尽管如此,我是否有理由在某处使用抽象类?谢谢!
我正在编写类似于具有可变维度的数组的代码.我所做的是维护线性底层集合并使用索引访问方法将其包装起来.由于数据结构的维度未知,我写的是类似的东西
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)
这很好,但不是我真正想要的.我想有关更新的问题可以通过两种方式解决:
关于+ =的问题似乎更复杂,甚至在索引具有固定长度时也存在.也许我们可以添加一个具有+ =运算符的对象并使用this(...)来获取对象(这样(...)+ = v将调用我们期望的某个方法),但这会与申请方法.
如果有人对上述任何问题有解决方案或有理由说我们不能编写这样的代码,请分享您的想法!谢谢〜
我已经围绕这个主题提出了几个问题,但这次我想进行更一般的讨论,因为在我看来,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) 是否可以重写以下代码
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.first并x.last提前将它们存储在其他vals到这里引用,但是这只是丑陋.有任何想法吗?谢谢!