我已经习惯了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)创建一个函数,在给定一个画面和一个列表的情况下,决定画面中的下一个分支是否应该是S或N(或者B,我们将忽略该情况); (2)使用高阶函数来封装递归模式f; (3)使用类似的功能f.
最好的选择是什么?
我正在尝试一项明显的任务:
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) 假设我有以下元组列表:
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个单独的语句?
我尝试在Clojure中执行以下操作
(map future exprs)
Run Code Online (Sandbox Code Playgroud)
获得未来令牌的seq.不幸的是,这个错误future本身就是一个宏,而不是一个函数.
有没有办法在保持map语法的同时完成这项工作?我宁愿不使用for宏(只是个人风格).
我想我正在寻找一张mmap或宏观地图.
我试图概括重复,嵌套flatMap但不确定是否存在.
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)
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) 假设我有以下类的对象列表.
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中执行此操作的最佳方法是什么?
我写了这个函数来获取数组的子集.php是否具有内置功能.我在文档中找不到一个.如果我重新发明轮子,似乎是浪费.
function array_subset($array, $keys) {
$result = array();
foreach($keys as $key){
$result[$key] = $array[$key];
}
return $result;
}
Run Code Online (Sandbox Code Playgroud) 我在其中一个职位发布中看到了这个问题,并且询问了什么是lambda函数以及它与高阶函数的关系.我已经知道如何使用lambda函数但不太自信解释它所以我做了一点google搜索并发现:什么是lambda(函数)?这个http://en.wikipedia.org/wiki/Higher-order_function
HOF的定义说至少应该采用一个或多个函数或返回一个函数,这适合于lambda是什么,所以我的问题是......是一种lambda是一种HOF?
或者任何可以进一步解释他们关系的人?
有相当多的博客文章(像这样)的标准库的用途功能apply/ with/ run/ also/ let可用,使它更容易一点distingish时实际使用的这那些漂亮的功能.
几个星期以来,官方文档甚至最终提供了关于该主题的指导:https://kotlinlang.org/docs/reference/coding-conventions.html#using-scope-functions-applywithrunalsolet
不过,我认为这是相当困难的记忆功能的个人使用的情况下,由函数名.我的意思是,对我来说,它们似乎是可以互换的,为什么不let被称为run例如?
有什么建议?我认为这些名字不是很有表现力,这使得一开始很难看出差异.
这是我在某处遇到的代码,但想知道它是如何工作的:
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