我无法理解functools中的部分工作原理.我从这里得到以下代码:
>>> sum = lambda x, y : x + y
>>> sum(1, 2)
3
>>> incr = lambda y : sum(1, y)
>>> incr(2)
3
>>> def sum2(x, y):
return x + y
>>> incr2 = functools.partial(sum2, 1)
>>> incr2(4)
5
Run Code Online (Sandbox Code Playgroud)
现在就行了
incr = lambda y : sum(1, y)
Run Code Online (Sandbox Code Playgroud)
我得到的是,无论我传递给incr它的任何论点都将被传递y给lambda哪个将返回sum(1, y)ie 1 + y.
我明白那个.但我不明白这一点incr2(4).
如何在部分函数中4传递x?对我来说,4应该更换sum2.x和之间有什么关系 …
首先,我正在阅读的真实世界Haskell表示永远不会使用foldl而是使用foldl'.所以我相信它.
但我对什么时候使用foldrvs. 朦胧foldl'.虽然我可以看到他们如何以不同的方式摆放在我面前的结构,但是当"哪个更好"时,我太愚蠢了.我想在我看来似乎并不重要,因为它们都产生相同的答案(不是吗?).事实上,我以前使用这个结构的经验来自Ruby inject和Clojure reduce,它们似乎没有"左"和"右"版本.(附带问题:他们使用哪个版本?)
任何有助于像我这样的智能挑战的洞察力都会非常感激!
我试着在Java 8流API中找到一种简单的方法来进行分组,我用这种复杂的方式出来了!
List<String> list = new ArrayList<>();
list.add("Hello");
list.add("Hello");
list.add("World");
Map<String, List<String>> collect = list.stream().collect(
Collectors.groupingBy(o -> o));
System.out.println(collect);
List<String[]> collect2 = collect
.entrySet()
.stream()
.map(e -> new String[] { e.getKey(),
String.valueOf(e.getValue().size()) })
.collect(Collectors.toList());
collect2.forEach(o -> System.out.println(o[0] + " >> " + o[1]));
Run Code Online (Sandbox Code Playgroud)
我很感激你的意见.
我最近一直在思考如何在C(而不是 C++)中进行函数式编程.显然,C是一种过程语言,本身并不真正支持函数式编程.
是否有任何编译器/语言扩展可以为语言添加一些函数式编程结构?GCC提供嵌套函数作为语言扩展; 嵌套函数可以从父堆栈框架访问变量,但距离成熟的闭包还有很长的路要走.
例如,我认为在C中真正有用的一件事是,在任何需要函数指针的地方,你都可以传递一个lambda表达式,创建一个衰变为函数指针的闭包.C++ 0x将包含lambda表达式(我觉得很棒); 但是,我正在寻找适用于直C的工具.
[编辑]为了澄清,我不是试图解决C中更适合函数式编程的特定问题; 如果我想这样做,我只是想知道那里有什么工具.
在带有lambda b93的JDK 8中,b93中有一个类java.util.stream.Streams.zip可用于压缩流(这在教程Exploring Java8 Lambdas中说明.Dhananjay Nene的第1部分).这个功能:
创建一个惰性和顺序组合Stream,其元素是组合两个流的元素的结果.
然而在b98中,这已经消失了.事实上,在b98Streams中的java.util.stream中甚至无法访问该类.
是否已移动此功能,如果是这样,我如何使用b98简洁地压缩流?
我想到的应用程序是在Shen的这个java实现中,我在其中替换了zip中的zip功能
static <T> boolean every(Collection<T> c1, Collection<T> c2, BiPredicate<T, T> pred)static <T> T find(Collection<T> c1, Collection<T> c2, BiPredicate<T, T> pred)具有相当冗长代码的函数(不使用b98中的功能).
lambda functional-programming lazy-evaluation java-8 java-stream
我觉得这比任何事都更有趣.我修好了,但我想知道原因.这是错误:DataManager.swift:51:90: Expression was too complex to be solved in reasonable time; consider breaking up the expression into distinct sub-expressions.为什么抱怨?这似乎是最简单的表达方式之一.
编译器指向该columns + ");";部分
func tableName() -> String { return("users"); }
func createTableStatement(schema: [String]) -> String {
var schema = schema;
schema.append("id string");
schema.append("created integer");
schema.append("updated integer");
schema.append("model blob");
var columns: String = ",".join(schema);
var statement = "create table if not exists " + self.tableName() + "(" + columns + ");";
return(statement);
}
Run Code Online (Sandbox Code Playgroud)
修复是:
var statement = "create …Run Code Online (Sandbox Code Playgroud) 大多数主流语言,包括面向对象编程(OOP)语言,如C#,Visual Basic,C++和Java,主要用于支持命令式(过程式)编程,而Haskell/gofer类似语言纯粹是功能性的.任何人都可以详细说明这两种编程方式之间的区别吗?
我知道这取决于用户要求选择编程方式,但为什么建议学习函数式编程语言?
lodash让我检查基本数据类型的成员资格includes:
_.includes([1, 2, 3], 2)
> true
Run Code Online (Sandbox Code Playgroud)
但以下不起作用:
_.includes([{"a": 1}, {"b": 2}], {"b": 2})
> false
Run Code Online (Sandbox Code Playgroud)
这让我感到困惑,因为以下搜索集合的方法似乎做得很好:
_.where([{"a": 1}, {"b": 2}], {"b": 2})
> {"b": 2}
_.find([{"a": 1}, {"b": 2}], {"b": 2})
> {"b": 2}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?如何检查集合中对象的成员资格includes?
编辑:问题最初是针对lodash版本2.4.1,更新为lodash 4.0.0
仅仅因为函数是第一类对象,有闭包和高阶函数,Javascript是否应该被称为函数式编程语言?我认为它缺少的主要功能是纯函数,并且它不像其他函数式语言那样"感觉",比如lisp(虽然这不是一个很好的理由,它不是一个功能性的语言......)