Questions tagged «higher-order-functions»

1
将Scala函数传递给Java 8方法
以下Scala代码可以正常工作,并且可以传递给需要功能的Java方法。有没有更清洁的方法可以做到这一点?这是我的第一遍: val plusOne = new java.util.function.Function[Int,Int] { override def apply(t:Int):Int = t + 1 override def andThen[V](after:function.Function[_ >: Int, _ <: V]): function.Function[Int, V] = ??? override def compose[V](before:function.Function[_ >: V, _ <: Int]): function.Function[V, Int] = ??? } 这是我的第二遍-它使用Java-8 Function接口的通用包装器来简化Scala语法: // Note: Function1 is Scala's functional interface, // Function …

3
高阶函数的命名约定?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 高阶函数有命名约定吗?即,返回其他功能的功能。 Javascript中的示例: function onlyDivisibleBy(div) { // <-- higher order function return function (n) { return n % div === 0; } } var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; arr.filter(onlyDivisibleBy(3)); // [0, 3, 6, 9] arr.filter(onlyDivisibleBy(5)); // [0, 5] 我倾向于按照上面的方式编写它:也就是说,在调用点进行了易读性优化(我读了上面的最后几行,即“过滤数组以使项只能被5整除”),但是在定义点从使用它的上下文来看,从其名称了解该函数的作用并不容易。

1
通用列表处理功能名称的由来
重复采用或重新发明了一些用于对列表或数组进行操作的高阶函数。功能映射,折叠 [ l | r ]和filter是在几种编程语言中一起发现的,例如Scheme,ML和Python,它们似乎没有共同的祖先。我将使用这三个名称来使问题集中。 为了表明名称不是通用的,这里是其他语言等效功能的名称示例。C ++ 转换而不是map,而remove_if而不是filter(颠倒了谓词的含义)。Lisp使用mapcar代替map,使用remove-if-not代替filter,并用reduce代替fold(某些现代Lisp变体具有map,但这似乎是派生形式。)C#使用Select代替map,而Where代替过滤器。C#的名称来自SQL,是通过LINQ进行的,尽管更改了名称,但其功能却受到Haskell的影响,而Haskell本身也受到ML的影响。 map,fold和filter的名称很普遍,但并不通用。这表明它们是从有影响力的来源借用到其他当代语言的。这些函数名称从何而来?

2
谁首先创造了术语高阶职能和/或头等公民?
我已经了解到,早在Haskell,O'Caml或LISP之前,高阶函数是一门学术研究主题,在数学中,Schönfinkel(1967年)和Haskell Curry(1968年)已经应用了诸如咖喱粉之类的技术,但是在任何编程语言中都没有。 根据Wikipedia的说法, Scheme 是引入适当的高阶函数作为一等公民的第一门语言,但是有人可以将原始想法归因于此吗?也许是1930年代发明了lambda演算的Alonzo Church?更具体地说,谁创造了以下定义,我在几本书和在线资源的各种释义中看到了以下定义? 当一个函数将另一个函数作为参数或返回一个函数时,该函数被认为是更高阶的。任何不将函数用作参数或返回类型的函数都称为一阶函数。

4
currying或部分应用有什么特别之处?
我每天都在阅读有关函数式编程的文章,并尝试尽可能地应用一些实践。但是我不明白在currying或部分应用程序中有什么独特之处。 以以下Groovy代码为例: def mul = { a, b -> a * b } def tripler1 = mul.curry(3) def tripler2 = { mul(3, it) } 我不了解tripler1和之间的区别tripler2。他们不是都一样吗?在纯或部分功能的语言(例如Groovy,Scala,Haskell等)中支持“ currying”。但是,我可以通过简单地创建另一个命名或匿名方法来做相同的事情(left-curry,right-curry,n-curry或部分应用程序)函数或闭包将tripler2大多数语言(甚至C)中的参数转发到原始函数(如) 我在这里想念什么吗?在某些地方可以在Grails应用程序中使用currying和Partial应用程序,但是我很犹豫这样做,因为我在问自己“那有什么不同?” 请赐教。 编辑:你们是说部分应用程序/ currying比创建/调用将默认参数转发到原始函数的另一个函数更有效吗?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.