Tag: 组合器

Data.MemoCombinators如何工作?

我一直在寻找Data.MemoCombinators的来源,但是我无法真正看到它的核心在哪里。 请向我解释一下这些组合器背后的逻辑以及他们如何在真实世界的编程中加速你的程序的机制。 我正在寻找这个实现的细节,并且可以与其他Haskell方法进行比较/对比。 我明白什么是memoization,我不是在寻找一般的工作原理的描述。

“Combinators”的好解释(非math家)

任何人都可以很好的解释“组合器”(Y-combinators等,而不是公司) 我正在寻找一个懂得recursion和高阶函数的实用程序员,但是没有很强的理论和math背景。 (请注意,我正在谈论这些事情: http : //en.wikipedia.org/wiki/Y_combinator )

foldr如何工作?

任何人都可以解释foldr如何工作的? 拿这些例子来说: Prelude> foldr (-) 54 [10, 11] 53 Prelude> foldr (\xy -> (x+y)/2) 54 [12, 4, 10, 6] 12.0 我对这些处决感到困惑。 有什么build议么?

foldl是尾recursion,那么foldr怎么比foldl跑得快呢?

我想testingfoldl vs foldr。 从我看到你应该使用foldl在任何时候都可以由于尾巴reccursion优化。 这是有道理的。 但是,运行这个testing后,我很困惑: (使用时间命令需要0.057s): a::a -> [a] -> [a] ax = ([x] ++ ) main = putStrLn(show ( sum (foldr a [] [0.. 100000]))) foldl(使用时间命令时需要0.089s): b::[b] -> b -> [b] b xs = ( ++ xs). (\y->[y]) main = putStrLn(show ( sum (foldl b [] [0.. 100000]))) 很显然,这个例子是微不足道的,但是我为什么会打败foldl而感到困惑。 这不是一个明确的情况下foldl胜利吗?

工人的组合者的解释

什么是组合器? 它是“一个没有自由variables的函数或定义”吗? 或者怎么样呢?根据约翰·休斯 ( John Hughes)在他着名的关于箭头的论文中, “一个组合器是一个从程序片断中构build程序片断的函数” ,这是有利的,因为“…程序员使用组合器构造大部分期望的自动编程,而不是手写每一个细节“。 他继续说, map和filter是这种组合filter的两个常见的例子。 一些符合第一个定义的组合器: 小号 ķ ÿ 其他人从模拟一只知更鸟 (我可能是错的 – 我没有读过这本书) 一些符合第二个定义的组合器: 地图 过滤 折合/减less(推测) 任何>> =,撰写,fmap ????? 我对第一个定义不感兴趣 – 那些不会帮助我写出一个真正的程序(+1,如果你说服我,我错了)。 请帮我理解第二个定义 。 我认为map,filter和reduce是有用的:它们允许我在更高层次编程 – 减less错误,缩短和更清晰的代码。 以下是关于组合器的一些具体问题: 什么是更多的组合器例如地图,filter? 编程语言经常使用什么组合器? 组合器如何帮助我devise更好的API? 我如何devise有效的组合器? 什么是类似于非函数式语言(比如Java)的组合器,或者这些语言用什么来代替组合器? 更新 感谢@CA McCann,现在我对组合器有了更好的理解。 但是有一个问题对我来说仍然是一个棘手的问题: 使用组合器编写的函数式程序与不使用大量组合式程序之间的区别是什么? 我怀疑答案是,组合型的版本更短,更清晰,更一般,但如果可能的话,我希望能够进行更深入的讨论。 我也在寻找更多的常用编程语言中复杂组合器的例子和解释(比fold更复杂)。

“小小的策士”中的Y组合讨论

所以我花了很多时间阅读和重读The Little Schemer第9章的结尾,其中适用的Y组合器是为“长度”函数而开发的。 我认为我的困惑归结为一个单一的陈述,对比两个版本的长度(在组合因子被排除之前): A: ((lambda (mk-length) (mk-length mk-length)) (lambda (mk-length) (lambda (l) (cond ((null? l) 0 ) (else (add1 ((mk-length mk-length) (cdr l)))))))) B: ((lambda (mk-length) (mk-length mk-length)) (lambda (mk-length) ((lambda (length) (lambda (l) (cond ((null? l) 0) (else (add1 (length (cdr l))))))) (mk-length mk-length)))) (第四版)指出,A“在我们将它应用于参数时返回一个函数”,而B“不返回函数”,从而产生自我应用的无限回归。 我被这个难住了 如果B被这个问题困扰,我不会看到A如何避免它。

什么是y-组合器?

y-combinator是从事物的“function”方面的comp-sci概念。 如果他们甚至听说过他们,大多数程序员对他们所知甚less。 什么是y-组合器? 他们如何工作? 他们有什么好处? 它们在程序语言中有用吗?