当我运行以下代码时,无论我在for循环中使用什么范围,代码总是打印出true十次.
public static void main(String[] args)
{
Random bool = new Random();
for (int i = 0; i < 10; i++) {
bool.setSeed(i);
System.out.println(bool.nextBoolean());
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我对代码稍作修改并让随机生成器nextBoolean()在打印之前运行一次函数,那么当我更改for循环的范围时,我得到正常的分布true和false输出中的chages:
public static void main(String[] args)
{
Random bool = new Random();
for (int i = 0; i < 10; i++) {
bool.setSeed(i);
bool.nextBoolean(); //Only change
System.out.println(bool.nextBoolean());
}
}
Run Code Online (Sandbox Code Playgroud)
在我看来,该nextBoolean()函数总是true在第一次执行时返回,这种行为是否有任何原因?
flatMap所以我一直在阅读一些关于 scala 中的 Monad 的文章,以及与其函数和理解相关的所有语法for。直观上,我理解为什么 Monad 需要使用函数map的一部分flatMap,就像通常当我map在零个、一个或多个元素的容器上使用函数时,它返回相同的容器,但传入的函数应用于所有元素容器。类似地,Monad 是零个、一个或多个元素的容器。
flatten然而,这部分的目的是什么flatMap?我无法理解其背后的直觉。对我来说,这似乎是额外的样板,需要传递所有函数来围绕其返回值创建一个容器/flatMap单子,只是让该容器立即被. 我想不出使用 的单个示例不能通过简单地替换为 来简化。例如:flattenflatMapflatMapmap
var monad = Option(5)
var monad2 = None
def flatAdder(i:Int) = Option(i + 1)
def adder(i:Int) = i + 1
// What I see in all the examples
monad.flatMap(flatAdder)
// Option[Int] = Some(6)
monad.flatMap(flatAdder).flatMap(flatAdder)
// Option[Int] = Some(7)
monad2.flatMap(flatAdder)
// Option[Int] = None
monad2.flatMap(flatAdder).flatMap(flatAdder)
// Option[Int] = None
// Isn't …Run Code Online (Sandbox Code Playgroud) 我目前正在学习 Scala 并且正在使用带有_通配符的匿名函数。这对我来说是有道理的:
// Creates function operation(a, b, c) => a + (b / c)
var operation = (_:Double) + (_:Double) / (_:Double)
Run Code Online (Sandbox Code Playgroud)
我不明白的是如何operation改为 return (a + b) / c。这些都不起作用:
// Attempting to create function operation(a, b, c) => (a + b) / c
var operation = ((_:Double) + (_:Double)) / (_:Double)
// error: value / is not a member of (Double, Double) => Double
var operation = ((_:Double) + (_:Double)).toDouble / (_:Double)
// error: …Run Code Online (Sandbox Code Playgroud)