Questions tagged «higher-order-functions»

高阶函数是将函数作为参数或将其返回作为输出(或两者)的函数。它们是函数式编程的基石。

4
为什么Haskell(GHC)这么快?
Haskell(使用GHC编译器)比您期望的要快得多。正确使用它可以接近低级语言。(Haskellers最喜欢做的事情是尝试获得5%的C(甚至击败它),但这意味着您正在使用效率低下的C程序,因为GHC将Haskell编译为C。)我的问题是,为什么? Haskell是声明性的,基于lambda演算。机器架构显然必须基于图灵机。实际上,Haskell甚至没有特定的评估顺序。另外,无需处理机器数据类型,而是始终创建代数数据类型。 最奇怪的是高阶函数。您可能会认为,即时创建函数并将其扔掉会使程序变慢。但是使用高阶函数实际上会使Haskell更快。实际上,为了优化Haskell代码,您似乎需要使其更优雅,更抽象,而不是像机器一样。如果不能改善Haskell的更高级功能,它们似乎都不会影响它的性能。 抱歉,这听起来很抱歉,但这是我的问题:考虑到Haskell的抽象性质以及与物理机器的区别,为什么Haskell(与GHC编译)这么快? 注意:我说C和其他命令式语言在某种程度上类似于图灵机的原因(但在某种程度上来说,Haskell与Lambda微积分不一样)是,在命令式语言中,您具有有限数量的状态(即行号)以及Tape(撞锤),以便状态和当前磁带决定对磁带执行什么操作。从图灵机到计算机的过渡,请参阅Wikipedia条目,图灵机等效项。


11
如何爆炸和修剪空白?
例如,我想根据此字符串中的元素创建一个数组: $str = 'red, green, blue ,orange'; 我知道您可以爆炸并遍历它们并进行修剪: $arr = explode(',', $str); foreach ($arr as $value) { $new_arr[] = trim($value); } 但是我觉得有一种方法可以解决这个问题。有任何想法吗?

4
如何使用ES6胖箭头对对象数组进行.filter()
我正在尝试使用ES6箭头功能.filter来返回成年人(杰克和吉尔)。看来我不能使用if语句。 为了在ES6中执行此操作,我需要了解什么? var family = [{"name":"Jack", "age": 26}, {"name":"Jill", "age": 22}, {"name":"James", "age": 5 }, {"name":"Jenny", "age": 2 }]; let adults = family.filter(person => if (person.age > 18) person); // throws error (8:37) SyntaxError: unknown: Unexpected token (8:37) |let adults = family.filter(person => if (person.age > 18) person); 我的工作ES5示例: let …

1
什么是同态?
通过阅读这个经典论文,我卡上paramorphisms。不幸的是,该部分很薄,并且Wikipedia页面什么也没说。 我的Haskell翻译是: para :: (a -> [a] -> b -> b) -> b -> [a] -> b para f base = h where h [] = base h (x:xs) = f x xs (h xs) 但是我不认为-我对类型签名或所需结果没有任何直觉。 什么是同质性,有什么有用的例子在起作用? 是的,我已经看过这些 问题,但是它们并没有直接涵盖同质性,仅指向了可能对参考有用的资源,但对学习材料却没有帮助。

4
PHP是否具有与Python的列表理解语法等效的功能?
Python在语法上具有甜美的列表理解能力: S = [x**2 for x in range(10)] print S; [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 在PHP中,我需要做一些循环: $output = array(); $Nums = range(0,9); foreach ($Nums as $num) { $out[] = $num*=$num; } print_r($out); 要得到: 数组([0] => 0 [1] => 1 [2] => 4 [3] => 9 …

13
在PHP中转置多维数组
您将如何在PHP中翻转90度(转置)多维数组?例如: // Start with this array $foo = array( 'a' => array( 1 => 'a1', 2 => 'a2', 3 => 'a3' ), 'b' => array( 1 => 'b1', 2 => 'b2', 3 => 'b3' ), 'c' => array( 1 => 'c1', 2 => 'c2', 3 => 'c3' ) ); $bar …

2
.map()之类的高阶函数如何在JavaScript内部进行工作?
如今,每个人都试图使用这类高阶函数以更少的代码获得有希望的结果。但是我不知道这些功能在内部如何工作。 假设我写类似 var numbers = [16, 25, 36]; var results = numbers.map(Math.sqrt); console.log(results); // [4, 5, 6] 运行代码段隐藏结果展开摘要 我知道'number'数组的每个元素都在一个一个地迭代,但是怎么做呢? 我试图进行搜索,但没有得到满意的答复。

2
Haskell:Typeclass与传递函数
在我看来,您总是可以传递函数参数,而不是使用类型类。例如,而不是定义相等类型类: class Eq a where (==) :: a -> a -> Bool 并在其他函数中使用它来指示类型实参必须是的实例Eq: elem :: (Eq a) => a -> [a] -> Bool 我们是否elem可以不使用类型类就定义函数,而是传递可以完成工作的函数参数?

2
结合Haskell代码片段以获得更大的画面
这是我在某处遇到的代码,但想知道它是如何工作的: findIndices :: (a -> Bool) -> [a] -> [Int] findIndices _ [] = [] findIndices pred xs = map fst (filter (pred . snd) (zip [0..] xs)) 输出:findIndices(== 0)[1,2,0,3,0] == [2,4],其中pred是(== 0)&xs是[1,2,0,3,0] 我将展示一些理解: (zip [0..] xs) 上一行所做的是将索引放入列表中的所有内容。对于上面给出的输入,它看起来像这样:[(0,1),(1,2,2,(2,0),(3,3),(4,0)] (pred . snd) 我发现这意味着像pred(snd(x))。我的问题是,列表是否由邮编组成?我倾向于是,但是我的猜测很脆弱。 接下来,是我对fst和snd的理解。我知道 fst(1,2) = 1 和 snd(1,2) = 2 …

3
某人写下这样的foldlM定义需要什么知识或培训?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 7个月前关闭。 最近,我试图在我的一些实际案例制作系统中使用Haskell。Haskell类型系统确实为我提供了很大的帮助。例如,当我意识到我需要某种类型的功能时 f :: (Foldable t, Monad m) => ( a-> b -> m b) -> b -> t a -> m b 实际上有类似的功能foldM,foldlM和foldrM。 但是,真正令我震惊的是这些功能的定义,例如: foldlM :: (Foldable t, Monad m) => (b -> a -> m b) -> b -> t a -> m b foldlM f …
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.