我试图在Mongo shell中做一个简单的map reduce,但是reduce函数永远不会被调用.这是我的代码:
db.sellers.mapReduce(
function(){ emit( this._id, 'Map') } ,
function(k,vs){ return 'Reduce' },
{ out: { inline: 1}})
Run Code Online (Sandbox Code Playgroud)
结果是
{
"results" : [
{
"_id" : ObjectId("4da0bdb56bd728c276911e1a"),
"value" : "Map"
},
{
"_id" : ObjectId("4da0df9a6bd728c276911e1b"),
"value" : "Map"
}
],
"timeMillis" : 0,
"counts" : {
"input" : 2,
"emit" : 2,
"output" : 2
},
"ok" : 1,
Run Code Online (Sandbox Code Playgroud)
}
怎么了?
我在Ubuntu 10.10上使用MongoDB 1.8.1 32位
我想调用该函数f5次(例如)并获得结果列表.现在我有这个:
(1..5).to_a.map!{f}
Run Code Online (Sandbox Code Playgroud)
注:现在f是不带任何输入,并返回一个函数true或false.所以当这个运行完成后,我得到一个5 true/ false值的列表.
有没有更好的方法来使用其他内置函数(可能reduce?我有这个想法,但无法弄清楚如何使用它...)
做这个的最好方式是什么:
def reduce[A](x: Option[A], y: Option[A])(f: (A, A) => A): Option[A] =
(x, y) match {
case (Some(a), Some(b)) => Some(f(a, b))
case (None, None) => None
case (_, None) => x
case (None, _) => y
}
Run Code Online (Sandbox Code Playgroud)
我看了这个问题,但他的情况与我的情况略有不同......
我正在尝试执行以下代码将元组数组转换为字典但我收到编译错误说:
类型'[String:String]'的不可变值仅包含名为'updateValue'的变异成员
var array = [("key0", "value0"), ("key1", "value1")]
var initial = [String: String]()
var final = array.reduce(initial) { (dictionary, tuple) in
dictionary.updateValue(tuple.0, forKey: tuple.1)
return dictionary
}
Run Code Online (Sandbox Code Playgroud)
为什么如果initial被声明为var?它与reduce 的签名上的@noescape有关吗?
func reduce<U>(initial: U, combine: @noescape (U, T) -> U) -> U
Run Code Online (Sandbox Code Playgroud) 我们已经习惯了foldr在Haskell中,你需要(例如,使用Java语法)一个List<T>和你回你想要的任何类型(<T>,List<T>,等).
例如在Haskell中,这个函数接受List<Integer>并返回另一个List<Integer>并用作累加器a List<Integer>(仅作为示例,函数的目标并不重要):
evens :: [Integer] -> [Integer]
evens = foldr (\ x acc -> if mod x 2 == 0 then x : acc else acc) []
Run Code Online (Sandbox Code Playgroud)
现在Java 8已经出来并且具有功能样式的特性,我们想要用我们在这里使用的那种函数来编写函数(不仅是一个无复制的等价函数List<T>)foldr:
public static Double entropy (List<Double> probs){
return -probs.stream().reduce(0.0, (acc, p) -> acc + p * Math.log(p, 2));
}
Run Code Online (Sandbox Code Playgroud)
使用的问题reduce是,当我们采取a时,List<T>我们只能返回a <T>,并且我们想要返回不同的类型甚至是集合.
foldr在Java 8中有什么办法吗?
当reduce()在并行流上使用该操作时,OCP考试书指出reduce()参数必须遵守某些原则.这些论点如下:
(a op b) op c等于a op (b op c).u和t combiner.apply(u, accumulator.apply(identity, t))等于accumulator.apply(u,t).考试书提供了两个例子来说明这些原则,请参阅下面的代码:
关联的示例:
System.out.println(Arrays,asList(1,2,3,4,5,6))
.parallelStream()
.reduce(0,(a,b) -> (a-b))); //NOT AN ASSOCIATIVE ACCUMULATOR
Run Code Online (Sandbox Code Playgroud)
OCP书中对此有何说法:
它可能会输出-21,3或其他一些值,因为累加器函数违反了associativity属性.
身份要求的示例:
System.out.println(Arrays.asList("w","o","l","f"))
.parallelStream()
.reduce("X", String::concat));
Run Code Online (Sandbox Code Playgroud)
OCP书中对此有何说法:
如果我们使用的身份参数不是真正的身份值,您可以看到其他问题.它可以输出XwXoXlXf.作为并行过程的一部分,标识将应用于流中的多个元素,从而导致非常意外的数据.
我不明白这些例子.使用累加器示例,累加器以0 -1 = -1然后-1 -2开始,其中= -3然后-6等等一直到-21.我明白,因为生成的arraylist不同步,结果可能是不可预测的,因为竞争条件等的可能性,但为什么累加器不关联?Woulden也不会(a+b)导致不可预测的结果?我真的没有看到示例中使用的累加器有什么问题,以及为什么它不是关联的,但是我仍然不能完全理解关联原则是什么.
我也不了解身份的例子.据我所知,如果4个独立的线程同时开始与身份一起累积,那么结果确实可能是XwXoXlXf,但这与身份参数本身有什么关系呢?究竟什么是适当的身份才能使用呢?
我想知道是否有人可以更多地了解这些原则.
谢谢
我想从reduce/fold导出n函数的合成函数,但它不能按预期工作:
$id = function ($x) {
return $x;
};
$comp = function ($f) {
return function ($g) use ($f) {
return function ($x) use ($f, $g) {
return $f($g($x));
};
};
};
$fold = function ($f, $acc) {
return function ($xs) use ($f, &$acc) {
return array_reduce($xs, $f, $acc);
};
};
$compn = function($fs) {/* apply $fold here */};
$inc = function ($n) {
return $n + 1;
};
$fold($comp, $id) ([$inc, $inc, $inc]) (0); // yields a closure instead …Run Code Online (Sandbox Code Playgroud) 试图解决代码战中的这一挑战。根据挑战,数组的部分:
ls = [0, 1, 3, 6, 10]
是
ls = [0, 1, 3, 6, 10]
ls = [1, 3, 6, 10]
ls = [3, 6, 10]
ls = [6, 10]
ls = [10]
ls = []
Run Code Online (Sandbox Code Playgroud)
我们需要返回一个包含这些部分之和的数组。
所以我的代码如下:
ls = [0, 1, 3, 6, 10]
ls = [1, 3, 6, 10]
ls = [3, 6, 10]
ls = [6, 10]
ls = [10]
ls = []
Run Code Online (Sandbox Code Playgroud)
问题在于,它希望我们在数组为空时将最后一个总和0加。所以我们应该得到:
[20,20,19,16,10,0]
代替
[20、20、19、16、10]
所以我尝试了这个:
function partsSums(ls) {
let arrayOfSums = …Run Code Online (Sandbox Code Playgroud)当我们检查reduce函数时:
my $result = reduce &reduction_procedure, @array;
Run Code Online (Sandbox Code Playgroud)
我们总结了以下内部工作的简单规则:
Reduction Rules
---------------
1. For the first pair of objects from our input (@array)
we apply the reduction procedure (&reduction_procedure) and we get our first result.
2. We apply the reduction procedure (&reduction_procedure) to the result (object)
of the previous rule and the next input (object) from our input (@array),
and we get an intermediate result (object).
3. We run rule.2 for every of the remaining objects from our input (@array)
Run Code Online (Sandbox Code Playgroud)
这个简单的规则对于归约元操作符 …
我有一个整数流,流的源是一个列表:[3, 27].
做的时候list.stream.reduce(1, (a,b) -> a/b)),我如何让reduce除以3/1 = 3然后27/3 = 9并返回9?