我正在玩Maybe和Either monad类型(链接,根据返回值应用条件函数,还返回链接函数失败的错误消息等).所以我觉得我们可以通过使用Either monad来实现相同和更多的事情.那么我的问题是那些之间的实际或概念上的区别?
我是懒惰评估概念的新手.当我在Scala中执行这行代码时;
"12334".grouped(1).toStream.filter{n => println("n:" +n ); n=="3";}
Run Code Online (Sandbox Code Playgroud)
打印出来:
n:1
n:2
n:3
Run Code Online (Sandbox Code Playgroud)
但是当我在Java中运行类似的东西时,例如:
List<String> myList = new ArrayList<>(Arrays.asList("12334".split("")));
Stream<String> myList2 = myList.stream().filter(a -> {System.out.println("a:" +a);return "3".equals(a);});
Run Code Online (Sandbox Code Playgroud)
它无声地终止,无需向控制台行写任何内容.Java的行为对我来说似乎更合理,因为Streams被懒惰地评估,我没有收集或尝试打印结果.但是在Scala中,即使我没有消耗流,它也会输出一些信息.所以我的问题是导致这种差异的原因是什么?
根据scala docs,stream实现了惰性列表,其中元素仅在需要时进行评估.例;
val fibs: Stream[BigInt] = BigInt(0) #:: BigInt(1) #:: fibs.zip(fibs.tail).map(n => {
n._1 + n._2
})
Run Code Online (Sandbox Code Playgroud)
之后在scala repl中;
fibs(4)
fibs
Run Code Online (Sandbox Code Playgroud)
它会打印出来;
res1:Stream [BigInt] = Stream(0,1,1,2,3,?)
由于调用.length或.last会导致无限循环,如何以最有效的方式获得值"3"(最后计算的值)?
这听起来像是一个新手错误,但我做了很多。在将惰性求值块或值传递给函数时,如果我忘记以某种方式使该函数的相应参数变为惰性(按名称传递/调用),乍一看会引起一些混乱,因为它强制求值。
lazy val a = {println("a");1}
def myfunc(b:Int){println("hello")}
myfunc(a);
Run Code Online (Sandbox Code Playgroud)
输出:
a
Hello
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,这个问题是否有任何编译器帮助?(标志等)或者这是我应该处理的事情?
假设我有一堆函数返回Just或Nothing值,我想将它们链接在一起;
var a = M.Just("5").map(function(data){
return 1;
}).chain(function(data){
/*Make some operation return Just or Nothing */
console.log(data);
return M.Just(2);
}).chain(function(data){
/*Make some operation return Just or Nothing */
console.log(data);
return M.Nothing("Reason 1");
}).chain(function(data){
/*Make some operation return Just or Nothing */
console.log(data);
return M.Nothing("Reason 2");
}).getOrElse(function(data){
console.log(data);
return "Message";
});
console.log(a());
Run Code Online (Sandbox Code Playgroud)
输出:
> 1
> 2
> undefined
> Message
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,因为它在函数返回M.Nothing("Reason 1")的步骤失败,所以它没有通过我预期的其他函数.我相信Nothing没有有效的构造函数来获取参数.有没有办法在执行结束时获取此失败消息?我在民间故事中也试过这个,它与梦幻土地规格有关吗?
谢谢
javascript functional-programming ramda.js fantasyland ramda-fantasy
根据databricks上的这篇博客,spark 依赖于 Hadoop 的提交协议类,因此如果由于某些故障而导致作业未完成,输出目录不会更改(部分输出文件不会发生)。
所以我的问题是;
在出现故障(HDFS、S3 等)时,spark 是否会阻止部分写入不同的存储?
在最终写入操作之前,不同的火花作业是否可以使用相同的临时位置?
多次提交的相同 Spark 作业是否可以使用相同的临时位置?
scala ×3
amazon-s3 ×1
apache-spark ×1
either ×1
fantasyland ×1
haskell ×1
hdfs ×1
java ×1
java-8 ×1
java-stream ×1
javascript ×1
maybe ×1
memoization ×1
monads ×1
ramda.js ×1
scalac ×1
stream ×1