标签: higher-order-functions

常见的递归模式

我已经习惯了Haskell的高阶函数.通常我可以使用map,fold和scan等函数替换显式的递归模式.但是,我经常遇到以下递归模式,我不明白如何使用高阶函数表达:

   f (x:[]) = k x
   f (x:xs) = g x (f xs)
Run Code Online (Sandbox Code Playgroud)

例如,假设我代表分析表.然后我创建一个数据类型,如:

   data Tableau = N Expr | S Expr (Tableau) | B Expr (Tableau) (Tableau)
Run Code Online (Sandbox Code Playgroud)

如果我想将Exprs 列表转换为tableau结构,我想要一个函数部分可能类似于:

   f (x:[]) = N x
   f (x:xs) = S x (f xs)
Run Code Online (Sandbox Code Playgroud)

现在,我看到三个选项:(1)创建一个函数,在给定一个画面和一个列表的情况下,决定画面中的下一个分支是否应该是SN(或者B,我们将忽略该情况); (2)使用高阶函数来封装递归模式f; (3)使用类似的功能f.

最好的选择是什么?

recursion haskell higher-order-functions

13
推荐指数
1
解决办法
813
查看次数

JavaScript reduce无法处理数学函数?

我正在尝试一项明显的任务:

var maxVal = [ 1, 2, 3, 4, 5 ].reduce( Math.max, 0 );
Run Code Online (Sandbox Code Playgroud)

得到:

NaN
Run Code Online (Sandbox Code Playgroud)

作为结果.为了使它工作,我必须以这种方式创建一个匿名函数:

var maxVal = [ 1, 2, 3, 4, 5 ].reduce( function ( a, b ) { 
                                           return Math.max(a, b);
                                       }, 0 );
Run Code Online (Sandbox Code Playgroud)

有人能告诉我为什么吗?两者都是带有两个参数并且都返回一个值的函数.有什么不同?

另一个例子可能是:

var newList = [[1, 2, 3], [4, 5, 6]].reduce( Array.concat, [] );
Run Code Online (Sandbox Code Playgroud)

结果是:

[1, 2, 3, 0, #1=[1, 2, 3], #2=[4, 5, 6], 4, 5, 6, 1, #1#, #2#]
Run Code Online (Sandbox Code Playgroud)

我只能在这个形状下在node.js中运行这个例子(Array在node.js v4.12中没有连接,我现在使用它):

var newList = [[1, 2, 3], …
Run Code Online (Sandbox Code Playgroud)

javascript reduce node.js higher-order-functions

13
推荐指数
1
解决办法
4394
查看次数

Scala:如何将元组元素转换为列表

假设我有以下元组列表:

val tuples = listOfStrings.map(string => {
            val split = string.split(":")
            (split(0), split(1), split(2))
        })
Run Code Online (Sandbox Code Playgroud)

我想在列表中得到split(0),在另一个列表中得到split(1),依此类推.这可以通过以下方式实现:

list1 = tuples.map(x => x._1).toList
list2 = tuples.map(x => x._2).toList
list3 = tuples.map(x => x._3).toList
Run Code Online (Sandbox Code Playgroud)

是否有更优雅(功能)的方式来实现上述内容而无需编写3个单独的语句?

scala tuples higher-order-functions

13
推荐指数
2
解决办法
2万
查看次数

如何在Clojure中映射宏?

我尝试在Clojure中执行以下操作

(map future exprs)
Run Code Online (Sandbox Code Playgroud)

获得未来令牌的seq.不幸的是,这个错误future本身就是一个宏,而不是一个函数.

有没有办法在保持map语法的同时完成这项工作?我宁愿不使用for宏(只是个人风格).

我想我正在寻找一张mmap或宏观地图.

macros clojure higher-order-functions

13
推荐指数
1
解决办法
1335
查看次数

摘要在重复的flatMap

我试图概括重复,嵌套flatMap但不确定是否存在.

以下代码将生成n选择3的所有组合,你选择3:

def choose3flatMap(n: Int, r: Int = 3) =
  (0 to n - r)
    .flatMap(i => (i + 1 to n - (r - 1))
      .flatMap(j => (j + 1 to n - (r - 2))
        .map(k => Seq(i, j, k))))
Run Code Online (Sandbox Code Playgroud)

重复flatMap操作,我们可以得到n的所有组合5,你选择5 :

def choose5flatMap(n: Int, r: Int = 5) =
  (0 to n - r)
    .flatMap(i => (i + 1 to n - (r - 1))
      .flatMap(j => (j …
Run Code Online (Sandbox Code Playgroud)

functional-programming scala higher-order-functions

13
推荐指数
1
解决办法
200
查看次数

如何在Kotlin中使用GROUP BY进行COUNT(*)?

假设我有以下类的对象列表.

class Contact(
    val name: String
    // ...
)
Run Code Online (Sandbox Code Playgroud)

我想检索一个Map<String, Int>将名称映射到其出现次数的名称.

在基于SQL的数据库上,我会查询:

SELECT name, count(*) FROM Contact;
Run Code Online (Sandbox Code Playgroud)

在具有更高阶函数的Kotlin中执行此操作的最佳方法是什么?

higher-order-functions kotlin

13
推荐指数
1
解决办法
3726
查看次数

根据键数组获取数组的子集

我写了这个函数来获取数组的子集.php是否具有内置功能.我在文档中找不到一个.如果我重新发明轮子,似乎是浪费.

function array_subset($array, $keys) {
    $result = array();
    foreach($keys as $key){
        $result[$key] = $array[$key];
    }
    return $result;
}
Run Code Online (Sandbox Code Playgroud)

php arrays higher-order-functions

12
推荐指数
2
解决办法
6621
查看次数

lambda是一种高阶函数吗?

我在其中一个职位发布中看到了这个问题,并且询问了什么是lambda函数以及它与高阶函数的关系.我已经知道如何使用lambda函数但不太自信解释它所以我做了一点google搜索并发现:什么是lambda(函数)?这个http://en.wikipedia.org/wiki/Higher-order_function

HOF的定义说至少应该采用一个或多个函数或返回一个函数,这适合于lambda是什么,所以我的问题是......是一种lambda是一种HOF?

或者任何可以进一步解释他们关系的人?

lambda higher-order-functions

12
推荐指数
2
解决办法
2105
查看次数

范围函数适用于/ with/run/also/let:名称来自哪里?

有相当多的博客文章(像这样)的标准库的用途功能apply/ with/ run/ also/ let可用,使它更容易一点distingish时实际使用的这那些漂亮的功能.

几个星期以来,官方文档甚至最终提供了关于该主题的指导:https://kotlinlang.org/docs/reference/coding-conventions.html#using-scope-functions-applywithrunalsolet

不过,我认为这是相当困难的记忆功能的个人使用的情况下,函数名.我的意思是,对我来说,它们似乎是可以互换的,为什么不let被称为run例如?

有什么建议?我认为这些名字不是很有表现力,这使得一开始很难看出差异.

lambda scoping higher-order-functions kotlin

12
推荐指数
3
解决办法
837
查看次数

结合 Haskell 代码的片段以获得更大的图景

这是我在某处遇到的代码,但想知道它是如何工作的:

    findIndices :: (a -> Bool) -> [a] -> [Int]
    findIndices _ [] = []
    findIndices pred xs = map fst (filter (pred . snd) (zip [0..] xs))
Run Code Online (Sandbox Code Playgroud)

输出:findIndices (== 0) [1,2,0,3,0]==[2,4],其中pred(==0)&xs[1,2,0,3,0]

我将展示我的一些理解:

    (zip [0..] xs)
Run Code Online (Sandbox Code Playgroud)

上面一行的作用是为列表中的所有内容添加索引。对于上面给出的输入,它是这样的:[(0,1),(1,2),(2,0),(3,3),(4,0)]

    (pred . snd)
Run Code Online (Sandbox Code Playgroud)

我发现这意味着类似于pred (snd (x)). 我的问题是,x列表是由该zip行制作的吗?我倾向于是,但我的猜测是站不住脚的。

接下来是我对fstand 的理解snd。我知道

    fst(1,2) = 1 
Run Code Online (Sandbox Code Playgroud)

    snd(1,2) = 2
Run Code Online (Sandbox Code Playgroud)

这两个命令如何在代码中有意义?

我的理解filter是它返回匹配条件的项目列表。例如, …

haskell composition pointfree function-composition higher-order-functions

12
推荐指数
2
解决办法
195
查看次数