我想知道是否有任何'简单'的方法来安全地更新不可变的scala集合.考虑以下代码:
class a {
private var x = Map[Int,Int]()
def update(p:(Int,Int)) { x = x + (p) }
}
Run Code Online (Sandbox Code Playgroud)
这段代码不是线程安全的,对吗?我的意思是,如果我们有两个线程调用update方法,并且假设x是包含{1 => 2}的映射,并且线程A调用update((3,4))并且只设法执行x +(p)部分代码.然后重新安排,线程B调用update((13,37))并成功更新变量x.线程A继续并结束.
完成所有这些后,值x将等于包含{1 => 2,3 => 4}的地图,对吗?而不是期望的{1 => 2,3 => 4,13 => 37}.有没有一种简单的方法来解决这个问题?我希望我的要求是不可靠的:)
顺便说一句,我知道有像Akka STM这样的解决方案,但除非必要,否则我宁愿不使用它们.
非常感谢您的回答!
编辑:另外,我更喜欢没有锁定的解决方案.Eeeew :)
我想问一下你对play框架的体验以及它的内存使用情况.问题是我正在为我的游戏项目(使用Scala)寻找托管,而我是一个贫穷的学生,所以我需要尽可能便宜的东西.我想在机架空间租用256mb ram的云服务器并在ubuntu-server ed上播放.在玻璃鱼后面.你们有什么意见吗?
感谢谢谢!
今天我想问一下这=> SomeType是什么意思.我发现它在本文中使用过.它位于"顺序组合器"部分.
谢谢你的回答!
有没有办法使用data.frame而不破坏列名?
我有以下结构:
$`Canon PowerShot`
[1] 9.997803e-01 9.997318e-01 3.327920e-01 3.327920e-01 9.988220e-01
[6] 4.030871e-05 4.928497e-05
$`Casio Exilim`
[1] 5.322024e-06 9.999646e-01 5.322024e-06 5.322024e-06 9.999646e-01
[6] 5.322024e-06 9.999646e-01
$FinePix
[1] 3.850036e-05 9.998887e-01 6.650074e-02 6.650074e-02 9.998465e-01
[6] 9.998465e-01 4.345598e-05
$`Kodak EasyShare`
[1] 3.548812e-05 9.998604e-01 3.996137e-01 3.996137e-01 9.987841e-01
[6] 3.179604e-05 2.789861e-05
$`Nikon Coolpix series`
[1] 9.156401e-02 9.998091e-01 1.995972e-01 1.995972e-01 9.996341e-01
[6] 7.033741e-05 8.499410e-05
Run Code Online (Sandbox Code Playgroud)
但使用后do.call(data.frame, my_list),我明白了:
Canon.PowerShot Casio.Exilim FinePix Kodak.EasyShare
1 9.997803e-01 5.322024e-06 3.850036e-05 3.548812e-05
2 9.997318e-01 9.999646e-01 9.998887e-01 9.998604e-01
3 3.327920e-01 5.322024e-06 6.650074e-02 3.996137e-01 …Run Code Online (Sandbox Code Playgroud) 有人可以帮我理解如何使用Applicative样式编写Parsec解析器吗?这是我的代码:
module Main where
import Control.Applicative hiding (many)
import Text.Parsec
import Data.Functor.Identity
data Cmd = A | B deriving (Show)
main = do
line <- getContents
putStrLn . show $ parseCmd line
parseCmd :: String -> Either ParseError String
parseCmd input = parse cmdParse "(parser)" input
cmdParse :: Parsec String () String
cmdParse = do
slash <- char '/'
whatever <- many alphaNum
return (slash:whatever)
cmdParse2 :: String -> Parsec String () String
cmdParse2 = (:) <$> (char '/') <*> …Run Code Online (Sandbox Code Playgroud) 我正在研究我的bc论文项目,该项目应该是用scala和Akka编写的Minecraft服务器.服务器应该可以轻松地部署在云中或集群上(不确定我是否使用正确的术语......它应该在多个节点上运行).然而,我是akka的新手,我一直想知道如何实现这样的事情.我现在想弄清楚的问题是如何在不同节点上的演员之间共享状态.我的第一个想法是有一个骆驼演员会从我的世界客户端读取TCP流,然后将其发送到负载平衡器这将选择将处理请求,然后发送通过TCP给客户一些响应的节点.假设我有一个AuthenticationService实现actor,它检查用户提供的凭据是否有效.每个节点都有这样的actor(或者可能更多),并且所有actor都应该始终拥有完全相同的用户数据库(或状态).我的问题是,保持这种状态的最佳方法是什么?我想出了一些我能想到的解决方案,但我没有做过这样的事情,所以请指出错误:
解决方案#1:将状态保存在数据库中.这可能会很好地工作,其中状态仅由类似的用户名和密码列表来表示该认证的例子,但它可能在那里状态包含对象不容易被分解成整数和字符串不会在情况下工作.
解决方案2:每次会有一定男主角会改变它的状态,要求演员会,处理请求有关的变化相同类型的所有其他行动人将改变根据自己的状态,广播信息后原始演员发送的信息.这看起来非常低效而且相当笨拙.
解决方案#3:让某个节点充当一个状态节点,其中会有代表整个服务器状态的actor.除了这样的节点中的actor之外的任何其他actor都没有状态,并且每次他们需要一些数据时都会询问"状态节点"中的actor.这似乎也是低效的,有点不容错误.
所以你有它.只有我真正喜欢的解决方案才是第一个,但就像我说的那样,它可能仅适用于非常有限的问题子集(当状态可以分解为redis结构时).来自更有经验的大师的任何回应都会非常受欢迎.此致,托马斯赫尔曼
首先,请随意更正我的问题的标题,我不太熟悉功能编程术语.
我的问题是,将函数作为"变量的内容"处理是否有任何开销(以及它有多重要).例如,在以下代码中:
class Processor {
val map = Map[Class[_],AnyRef => Something](...)
def process(c:AnyRef):Something = map(c.getClass)(c)
def worksFor:List[Class[_]] = map.map(_._1)
}
Run Code Online (Sandbox Code Playgroud)
真的很好,相比之下:
class Processor {
def worksFor = List(classOf[Bears], classOf[Beets], classOf[BattlestarGalactica])
def process(c: AnyRef) = {
c match {
case c: Bears ....
.
.
.
}
}
}
Run Code Online (Sandbox Code Playgroud)
但它会表现得更差吗?(显然它需要更多的内存,因为地图)
谢谢你的回答!
我想问一下你是否有任何经验{和,或}可以指向我与Emacs的项目管理扩展,它与{Scala,Ensime,SBT}配合得很好.如果它不需要太多的黑客攻击也会令人惊讶.我过去做了一些计划,但我对Emacs平台没什么经验.
基本上,通过项目管理,我的意思主要是"将文件绑定到项目中"然后在它们之间进行搜索(并且仅在它们之间).
感谢您花时间阅读并回答!
有没有办法在给定目录中的每个代码更改上运行任务?最好是~在SBT中与操作员一起使用的东西,这样我就能做到:
~jadeCompile
Run Code Online (Sandbox Code Playgroud)
运行自定义jadeCompile任务.
我想知道,有没有相当于python的传递表达式?我们的想法是编写没有实现的方法签名,并编译它们只是为了某些库原型的类型检查签名.我能够使用这种模拟这种行为:
def pass[A]:A = {throw new Exception("pass"); (new Object()).asInstanceOf[A]}
Run Code Online (Sandbox Code Playgroud)
现在我写的时候:
def foo():Int = bar()
def bar() = pass[Int]
Run Code Online (Sandbox Code Playgroud)
它的工作原理(它可以运行,但运行时爆炸,这很好),但我的实现感觉不对(例如java.lang.Object()的用法).有没有更好的方法来模拟这种行为?
我想知道是否有人可以帮助我.我有一个克隆linux的极客工具的计划.但我不知道你是否可以某种方式使用Linux桌面作为画布来绘制文本等.我试着谷歌但我什么都没发现.我需要做的是基本上能够在桌面的某些部分上绘制文本,使它看起来像是壁纸的一部分(来自c ++).无论是那个还是能够创建无边框,透明的窗口,可以点击并始终在背景上.如果有人能给我任何指示从哪里开始,我将非常高兴.
感谢您提前的帮助:]
这可能是一个愚蠢的问题,但我无法在任何地方找到答案.我是一个Haskell新手,我遇到了I/O问题.
我有这个结构:
data SrcFile = SrcFile (IO Handle) String
srcFileHandle :: SrcFile -> IO Handle
srcFileHandle (SrcFile handle _) = handle
srcFileLine :: SrcFile -> String
srcFileLine (SrcFile _ string) = string
Run Code Online (Sandbox Code Playgroud)
现在的问题是我不知道如何将stdin/stderr/stdout分配给它,因为stdin等是Handler,没有IO处理程序.如果我使结构具有IO Handle的Handle属性,那么我将无法在其中添加任何其他文件句柄.
是否可以在R中只有一行矩阵?
这是我的代码:
nas <- which(!is.na(y))
x <- x[nas,]
y <- y[nas]
...
data.frame(y,x)
Run Code Online (Sandbox Code Playgroud)
我的想法是我有一个向量y和矩阵x.Y可以包含一些NA值,我想要找到它们并从矢量和矩阵中删除这些值的索引.
后来我想用x框架y.但问题是,当y中只有一个非NA的值时.这意味着我必须从y中删除除1个元素以外的所有元素,而从x除了1行,这个矩阵只有1行,似乎转换为数字,这似乎打破了data.frame操作.我希望它返回包含1行的框架:y x1 x2 ..,而不是我得到:
y x
1 0 12.0
2 0 14.8
3 0 14.2
4 0 14.8
5 0 2.0
6 0 4.0
7 0 1.0
8 0 2.0
9 0 26.0
10 0 4.0
11 0 6.0
12 0 2.0
13 0 16.0
Run Code Online (Sandbox Code Playgroud) scala ×6
haskell ×2
r ×2
sbt ×2
actor ×1
akka ×1
akka-cluster ×1
applicative ×1
c++ ×1
collections ×1
concurrency ×1
desktop ×1
emacs ×1
ensime ×1
linux ×1
performance ×1
x11 ×1