最近我接受了Scala Developer职位的采访.我被问到这样的问题
// matrix 100x100 (content unimportant)
val matrix = Seq.tabulate(100, 100) { case (x, y) => x + y }
// A
for {
row <- matrix
elem <- row
} print(elem)
// B
val func = print _
for {
row <- matrix
elem <- row
} func(elem)
Run Code Online (Sandbox Code Playgroud)
问题是:哪种实施方式A或B更有效?
我们都知道,理解可以转化为
// A
matrix.foreach(row => row.foreach(elem => print(elem)))
// B
matrix.foreach(row => row.foreach(func))
Run Code Online (Sandbox Code Playgroud)
B可以写成 matrix.foreach(row => row.foreach(print _))
据说正确答案是B,因为A会创建print100倍以上的函数.
我检查了语言规范,但仍然无法理解答案.有人可以向我解释一下吗?
我有图遍历的问题.使用典型的图遍历算法(DFS,BFS)无法解决我的用例.我想要从特定节点(N)开始的遍历节点,其中edge是ET类型.我想检索所有节点及其路径从N到节点.这可以使用Orient的策略之一,但我希望拥有所有可能的路径 - 不仅仅是一条路径.
样品:
对于上图,从R到C有两条路径:
我的图表可能有点复杂,但想法是一样的.
在OrientDB文档中,我发现有一个方法Graph可以返回所有的边(getEdgesofClass(String class)).我认为我可以解决我的问题如果我可以以某种方式指定图形(主图的子图 - 只有与根节点连接的节点),我想在其上调用此方法.
感谢所有的投入.
我想知道 ScalaEither是否真的是Monad范畴论意义上的?我知道 Monads 应该有bind和return方法。是什么Either的bind呢?
我正在尝试编写一个从 Unix 套接字读取的服务器:
use std::io::prelude::*;
use std::os::unix::net::{UnixListener, UnixStream};
fn main() {
let socket_name = "socket";
let listener = match UnixListener::bind(&socket_name) {
Err(err) => panic!("Failed to bind to socket: {}.", err),
Ok(stream) => stream,
};
for mut stream in listener.incoming() {
match stream {
Ok(ref mut stream) => {
let msg = read(stream);
stream.write_all(msg.as_bytes()).expect("Echo");
}
Err(err) => panic!("Error occured when listening from the stream. {}", err),
}
}
fn read(stream: &mut UnixStream) -> String {
let mut s = String::new();
stream.read_to_string(&mut …Run Code Online (Sandbox Code Playgroud) 我一直在阅读Scala文档,在浏览Option课程时,我看到了如下所示的filter实现:
final def filter(p: A => Boolean): Option[A] =
if (isEmpty || p(this.get)) this else None
Run Code Online (Sandbox Code Playgroud)
为什么我们要检查我们的Option实例是否为空?这不会导致这None两种方式吗?