任何人都可以在Paul Graham的ANSI Common Lisp第110页中解释一个例子吗?
该示例尝试解释use&rest和lambda来创建函数式编程工具.其中之一是构成函数参数的函数.我找不到任何解释它是如何工作的东西.代码如下:
(defun compose (&rest fns)
(destructuring-bind (fn1 . rest) (reverse fns)
#'(lambda (&rest args)
(reduce #'(lambda (v f) (funcall f v))
rest
:initial-value (apply fn1 args)))))
Run Code Online (Sandbox Code Playgroud)
用法是:
(mapcar (compose #'list #'round #'sqrt)
'(4 9 16 25))
Run Code Online (Sandbox Code Playgroud)
输出是:
((2) (3) (4) (5))
Run Code Online (Sandbox Code Playgroud)
2号线和6号线对我来说看起来特别神奇.任何意见将不胜感激.
出于某种原因,我只是从mac中的couchdb中的map/reduce结果中获取一个null键
结果:
{"rows":[
{"key":null,"value":2224}
]}
Run Code Online (Sandbox Code Playgroud)
我使用couchapp v8.1和couchdb v1.0.2
我的地图功能是:
function(doc) {
emit(doc.doc_type, 1);
}
Run Code Online (Sandbox Code Playgroud)
我的reduce函数是:
function(key, values, rereducer) {
return sum(values);
}
Run Code Online (Sandbox Code Playgroud)
结果我期待:
{"rows":[
{"key":"type1","value":22}
{"key":"type2","value":32}
{"key":"type3","value":25}
//snip snip
]}
Run Code Online (Sandbox Code Playgroud)
知道我哪里错了吗?
我继续学习java 8.
我发现了有趣的行为:
让我们看看代码示例:
// identity value and accumulator and combiner
Integer summaryAge = Person.getPersons().stream()
//.parallel() //will return surprising result
.reduce(1, (intermediateResult, p) -> intermediateResult + p.age,
(ir1, ir2) -> ir1 + ir2);
System.out.println(summaryAge);
Run Code Online (Sandbox Code Playgroud)
和模型类:
public class Person {
String name;
Integer age;
///...
public static Collection<Person> getPersons() {
List<Person> persons = new ArrayList<>();
persons.add(new Person("Vasya", 12));
persons.add(new Person("Petya", 32));
persons.add(new Person("Serj", 10));
persons.add(new Person("Onotole", 18));
return persons;
}
}
Run Code Online (Sandbox Code Playgroud)
12 + 32 + 10 + 18 = 72
对于序列流,此代码始终返回73(72 …
我希望我能以正确的方式提出这个问题.我正在学习Elastic MapReduce的方法,并且我看到了许多对"Aggregate"减速器的引用,它可以与"Streaming"作业流程一起使用.
在亚马逊的"Amazon Elastic MapReduce简介"PDF中,它声明"Amazon Elastic MapReduce有一个名为aggregrate的默认缩减器"
我想知道的是:还有其他默认减速机可用吗?
我知道我可以编写自己的减速机,但我不想写完已经存在的东西并"重新发明轮子",因为我确信我的轮子不会像原来那样好.
给定一个值列表,如果所有元素都不是NIL,我想将列表减少到T,否则就是NIL.这给了我一个错误:
(apply #'and (get-some-list))
Run Code Online (Sandbox Code Playgroud)
就像这样:
(reduce #'and (get-some-list))
Run Code Online (Sandbox Code Playgroud)
这是我提出的最好的:
[11]> (defun my-and (x y) (and x y))
MY-AND
[12]> (reduce #'my-and '(T T T T T))
T
[13]> (reduce #'my-and '(T T T T NIL))
NIL
Run Code Online (Sandbox Code Playgroud)
为什么"#"和"无效?在Common Lisp中有更惯用的方法吗?
我有5个词典,我想要一个他们的键的联合.
alldict = [dict1, dict2, dict3, dict4, dict5]
Run Code Online (Sandbox Code Playgroud)
我试过了
allkey = reduce(lambda x, y: set(x.keys()).union(y.keys()), alldict)
Run Code Online (Sandbox Code Playgroud)
但它给了我一个错误
AttributeError: 'set' object has no attribute 'keys'
Run Code Online (Sandbox Code Playgroud)
我做错了吗?我使用普通的forloop但我想知道为什么上面的代码不起作用.
我认为标题已经解释了我的问题.我想改变
key (tab space) value
Run Code Online (Sandbox Code Playgroud)
成
key;value
Run Code Online (Sandbox Code Playgroud)
在所有输出文件中,reducer是从映射器的输出生成的.
我用谷歌找不到这方面的好文档.任何人都可以提供一些关于如何实现这一目标的代码?
不久前,我在StackOverflow上发布了一个问题,表明JavaScript中的本机实现reduceRight很烦人.因此,我创建了一个Haskell风格的foldr函数作为补救措施:
function foldr(array, callback, initial) {
var length = array.length;
if (arguments.length < 3) {
if (length > 0) var result = array[--length];
else throw new Error("Reduce of empty array with no initial value");
} else var result = initial;
while (length > 0) {
var index = --length;
result = callback(array[index], result, index, array);
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
但是,我从未使用过这个foldr函数,因为我从不需要从右到左遍历数组.这让我思考,为什么foldr我不像在Haskell中那样使用JavaScript,以及foldr在JavaScript 中使用什么样的真实世界示例?
我可能是错的,但我相信该foldr函数在Haskell中被广泛使用,原因是:
根据Databricks的最佳实践,groupByKey应该避免使用Spark ,因为Spark groupByKey处理的工作方式是首先将信息拖放到工作人员之间,然后进行处理.说明
所以,我的问题是,有哪些替代方案能够groupByKey以分布式和快速的方式返回以下内容?
// want this
{"key1": "1", "key1": "2", "key1": "3", "key2": "55", "key2": "66"}
// to become this
{"key1": ["1","2","3"], "key2": ["55","66"]}
Run Code Online (Sandbox Code Playgroud)
在我看来,可能aggregateByKey或者glom可以先在partition(map)中执行,然后将所有列表连接在一起(reduce).
假设一个对象数组如下:
const listOfTags = [
{id: 1, label: "Hello", color: "red", sorting: 0},
{id: 2, label: "World", color: "green", sorting: 1},
{id: 3, label: "Hello", color: "blue", sorting: 4},
{id: 4, label: "Sunshine", color: "yellow", sorting: 5},
{id: 5, label: "Hello", color: "red", sorting: 6},
]
Run Code Online (Sandbox Code Playgroud)
如果标签和颜色相同,则重复输入.在这种情况下,id = 1且id = 5的对象是重复的.
如何过滤此数组并删除重复项?
我知道解决方案,您可以使用以下内容过滤一个键:
const unique = [... new Set(listOfTags.map(tag => tag.label)]
Run Code Online (Sandbox Code Playgroud)
但是多个键呢?
根据评论中的要求,这里是期望的结果:
[
{id: 1, label: "Hello", color: "red", sorting: 0},
{id: 2, label: "World", color: "green", sorting: 1}, …Run Code Online (Sandbox Code Playgroud) reduce ×10
common-lisp ×2
dictionary ×2
hadoop ×2
javascript ×2
map ×2
mapreduce ×2
python ×2
aggregate ×1
amazon ×1
apache-spark ×1
apply ×1
closures ×1
couchapp ×1
couchdb ×1
filter ×1
fold ×1
haskell ×1
iteration ×1
java ×1
java-8 ×1
java-stream ×1
lambda ×1
lisp ×1
paul-graham ×1
pyspark ×1
rdd ×1
unique ×1