我一直在使用Scala Akka库并遇到了一些问题.正如标题所说,我需要转换Map[A, Future[B]]为Future[Map[A,B]].我知道可以使用Future.sequence像Lists这样的Iterables,但在这种情况下这不起作用.
我想知道:在Scala中有一个干净的方法来进行这种转换吗?
我一直在努力学习scala的来龙去脉,最近我遇到了一些我很好奇的东西.
据我所知,如果我想将一段有效延迟评估的代码传递给一个函数,(不进行现场评估)我可以输入:
def run(a: =>Int):Int = {...}
Run Code Online (Sandbox Code Playgroud)
从这个意义上说,函数run接收一个尚待评估的代码块,它会对其进行求值并返回计算出的Int of.然后我尝试将这个想法扩展到List数据结构.打字:
def run(a: List[=>Int]) = {...}
Run Code Online (Sandbox Code Playgroud)
但是,这会返回错误.我想知道为什么这是不允许的.除了通过这种语法,我可以如何传递未评估的代码块列表?
我最近遇到了一个问题.我试图以编译器友好的方式压扁"尾嵌套"元组,我想出了下面的代码:
implicit def FS[T](x: T): List[T] = List(x)
implicit def flatten[T,V](x: (T,V))(implicit ft: T=>List[T], fv: V=>List[T]) =
ft(x._1) ++ fv(x._2)
Run Code Online (Sandbox Code Playgroud)
以上代码适用于扁平元组,我称之为"尾嵌套",如下所示.
flatten((1,2)) -> List(1,2)
flatten((1,(2,3))) -> List(1,2,3)
flatten((1,(2,(3,4)))) -> List(1,2,3,4)
Run Code Online (Sandbox Code Playgroud)
但是,我试图让我的解决方案更加强大.考虑一个案例,我有一个这些高级"尾嵌套"元组的列表.
val l = List( (1,2), (1,(2,3)), (1,(2,(3,4))) )
Run Code Online (Sandbox Code Playgroud)
推断的类型签名就是这样List[(Int, Any)],这会对诸如以下操作造成问题map:
error: No implicit view available from Any => List[Int]
这个错误对我来说很有意义,因为flatten函数中我的递归隐式链的性质.但是,我想知道:有没有什么方法可以让我的方法使元组变得更加强大,以便更高阶的函数,比如map网格很好?
编辑:
正如Bask.ws指出的那样,产品特性提供了一个很好的解决方案的潜力.以下代码说明了这一点:
def flatten(p: Product): List[_] = p.productIterator.toList.flatMap {x => x match {
case pr: Product => flatten(pr)
case _ => List(x)
}} …Run Code Online (Sandbox Code Playgroud) matrix m1(5,5);
matrix m2(5,5);
m1 = matrix(m2);
Run Code Online (Sandbox Code Playgroud)
对于上面的代码(对于任意类,矩阵),当m2的信息被复制到它时,是否会为与m1相关的信息调用析构函数?
我正在使用一个使用facebook opengraph的应用程序,通过相应的自定义操作将自定义对象发布到用户的墙上.在iOS环境中工作时,我正在尝试使用SDK函数调用:
- (FBRequest*)requestWithGraphPath:(NSString *)graphPath
andParams:(NSMutableDictionary *)params
andHttpMethod:(NSString *)httpMethod
andDelegate:(id <KC_FBRequestDelegate>)delegate;
发布对象.我将GraphPath指定为:
"me/[APP_NAME]:[APP_ACTION]"
Run Code Online (Sandbox Code Playgroud)
并为Params提供了一个正确的访问令牌,api_key和url到要发布在用户墙上的对象.
然后我收到错误消息:
{"error":{"message":"(#100) Application does not own 479077275455517 action type","type":"OAuthException","code":100}}
Run Code Online (Sandbox Code Playgroud)
在Facebook的回应中.
任何见解?
我正在开发一个涉及快速解析大量数据的项目.目前,此数据位于磁盘上,并分解为目录层次结构:
(Folder: DataSource) -> (Files: Day1, Day2, Day3...Day1000...)
(Folder: DataSource2) -> (Files: Day1, Day2, Day3...Day1000...)
...
(Folder: DataSource1000) -> ...
...
Run Code Online (Sandbox Code Playgroud)
每天文件包含需要非常快速访问的条目.
我最初的计划是在java中使用传统的FileIO来访问这些文件,但是经过进一步阅读,我开始担心这可能太慢了.
简而言之,从不同的DataSources和Days中选择性地从我的文件系统加载条目的最快方法是什么?
以下功能溢出,我不明白为什么.当使用x作为0,y作为0并且dim作为2运行时,结果应为6.但是,我收到一个错误,指示函数中的某些Long值(x或y)在溢出时为554.这不应该是可能的,因为x和y都受昏暗值限制,在我的测试中它被设置为2.这是代码:
def lattice(dim: Long, x: Long, y: Long): Long = {
if (x == dim && y == dim) {
1
}
if (x >= dim) {
lattice(dim,x,y+1L)
}
if (y >= dim) {
lattice(dim,x+1L,y)
}
else {
lattice(dim,x+1L,y) + lattice(dim,x,y+1L)
}
}
Run Code Online (Sandbox Code Playgroud) 我对演员的想法比较陌生,并且想知道我是否可以对我正在做的事情进行一些批评.对于项目的一部分,我需要有一个演员,告诉听众演员的时间.必须能够将倾听演员添加到此演员.
目前我有这个:
import akka.actor.Actor;
import akka.actor.ActorRef;
import com.github.nscala_time.time.Imports._;
class TimeManager extends Actor {
var actors:List[ActorRef] = List();
def receive = {
case AdvanceTime() => actors foreach (_ ! DateTime.now)
case AddListener(x) => actors = x :: actors
}
}
Run Code Online (Sandbox Code Playgroud)
有没有什么办法可以从这段代码中删除状态(var actors)以使其更具功能性?