combinators相关内容
Y 组合器是来自“功能"的计算机科学概念;事情的一面.大多数程序员根本不了解组合子,如果他们甚至听说过它们的话. 什么是 Y 组合子? 组合子是如何工作的? 它们有什么用? 它们在过程语言中有用吗? 解决方案 如果您准备好长时间阅读,Mike Vanier 有一个很棒的解释.长话短说,它允许您用一种本身不一定支持递归的语言来实现递归.
..
是否有一些 map 的替代品来并行评估列表?我不需要它偷懒. 类似:pmap :: (a -> b) ->[a] ->[b] 让我 pmap 昂贵的函数 big_list 并让我的所有内核都达到 100%. 解决方案 是的,参见 并行包: ls `using` parList rdeepseq 将通过 rdeepseq 策略并行评估列表中的每个元素.请注意,如果您的元素太便宜而无
..
我目前正在阅读 Real World Haskell 的第 4 章,我正在尝试将我的头脑围绕在 在foldr 方面实现foldl. (这是他们的代码:) myFoldl :: (a -> b -> a) ->->[b] ->一个myFoldl f z xs = foldr step id xs z其中步骤 x g a = g (f a x) 我想我会尝试使用相同的技术实现 zip,但我似
..
谁能解释一下 foldr 工作吗? 以这些例子为例: 前奏>文件夹 (-) 54 [10, 11]53前奏>foldr (\x y -> (x+y)/2) 54 [12, 4, 10, 6]12.0 我对这些处决感到困惑.有什么建议吗? 解决方案 foldr 从列表的右端开始,并使用您提供的函数将每个列表条目与累加器值组合起来.结果是累加器在所有列表元素中“折叠"后的最终值.它的
..
我一直在查看 Data.MemoCombinators 但我真的看不出它的核心在哪里. 请向我解释所有这些组合器背后的逻辑是什么,以及它们如何在现实世界编程中加速您的程序的实际工作机制. 我正在寻找这个实现的细节,并且可以选择与其他 Haskell 记忆方法进行比较/对比.我了解记忆化是什么,并且我不寻找它的一般工作原理的描述. 解决方案 这个库是众所周知的记忆技术的直接组合.
..
中 myAny 函数的代码这个问题使用foldr.当谓词满足时,它停止处理无限列表. 我使用 foldl 重写了它: myAny :: (a -> Bool) -> [a] -> BoolmyAny p list = foldl step False list在哪里步骤 acc 项目 = p 项目 ||收货 (注意 step 函数的参数是正确反转的.) 但是,它不再停止处理无限列表
..
对于 Y 组合子定理, 对于每个函数 F 都存在一个 X 使得 FX=X 这里的 F 是什么意思?F(x) = x +1 的不动点是什么?我的理解是 x+1=x 没有解决方案? 对于下面的证明: 对于任何函数 F,令 W 为函数 λx.F(xx) 并令 X = WW.我们声称 X 是 F 的不动点. 证明如下X = WWX = λx.F(xx) WX = F(WW)X = 外汇 λ
..
所以,假设我想为 PartialFunction 提供一个“全能"后备: val foo: PartialFunction[Int, String] = { case 1 =>“富"}val withDefault = foo orElse { _.toString } 这不会编译:缺少扩展函数的参数类型 ((x$1) => x$1.toString).这: val withDefaul
..
我正在经历一个尝试避免临时变量和过度使用条件的阶段,我可以使用更流畅的编码风格.我非常喜欢在我想要获取需要返回的值的地方使用 #tap,但在返回之前先用它做一些事情. def fluid_methodsomething_complicated(a, b, c).tap do |obj|obj.update(:x => y)结尾结尾 对比.程序: def non_fluid_methodobj
..
正如我经常观察到的以及我经常实现 name 属性的方式,就是将其简单地建模为 String. 现在,如果名称必须遵循某种语法,即格式,该怎么办?在 Java 中,我可能会定义一个构造函数并检查其参数,例如: public Name(str: String) {if (str == null) throw new IllegalArgumentException("Str 不能为 null.
..
我在将lambda转换为SKI组合器时遇到了麻烦(我希望这是有道理的).这是我的转换: /fxy.fyx /f./x./y.fyx /f./x.S (/y.fy) (/y.x) /f./x.S f (/y.x) /f./x.S f (K x) /f.S (/x.S f) (/x.K x) /f.S (/x.S f) K /f.S (S (/x.S) (/x.f)) K /f.S (S (K
..
约翰·休斯(John Hughes)在他的《将Monads推广到Arrows》中写道(第8章): 我们将first f仅依赖于对的第一个组成部分的属性形式化,如下所示: first f >>> arr fst = arr fst >>> f 我知道法律会过滤掉此类实施方式: newtype KleisliMaybe a b = KMb { runKMb :: a -> Maybe
..
能否请您解释表达式((...(.)))的含义? 据我所知(.)的类型为(b-> c)->(a-> b)-> a-> c. 解决方案 (.) . (.)是组合运算符及其本身的组合. 如果我们看 ((.) . (.)) f g x 我们可以评估几个步骤,首先我们将其括起来, ((((.) . (.)) f) g) x 然后我们使用(foo . bar) arg = f
..
在Edward Kmett的演讲幻灯片,折叠和遍历中,“力量就是力量在点中",他显示(.) . (.) . (.)的类型为 (a -> b) -> (c -> d -> e -> a) -> c -> d -> e -> b 我可以通过在GHCI中显示其类型来查看它.但是我也想知道为什么.我想了解的另一件事是,为什么在参数从(.)到(.) . (.)和(.) . (.) . (.)的规
..
这是Scala中Y组合器的实现: scala> def Y[T](func: (T => T) => (T => T)): (T => T) = func(Y(func))(_:T) Y: [T](func: (T => T) => (T => T))T => T scala> def fact = Y { | f: (Int => Int) =>
..
因此,我花了很多时间阅读和重新阅读 Little Schemer 中第9章的结尾,其中为length函数开发了适用的Y组合器.我认为我的困惑归结为一个单一的陈述,该陈述对比了两种长度的形式(在排除组合器之前): A: ((lambda (mk-length) (mk-length mk-length)) (lambda (mk-length) (lambda (
..
是否存在用于创建相互递归函数元组的定点组合器? IE.我正在寻找类似Y-Combinator的东西,但是它需要多个“递归" *函数,并且将返回一个函数元组? *:当然不是真正的递归,因为它们被编写为以通常的Y-Combinator方式将自己(和兄弟姐妹)作为参数. 解决方案 您要寻找的生物是 Y * 组合器. 基于此页面由 oleg-at-okmij.org 我将 Y * 移植
..
Cleave是用于最小化代码重复的真正有用的组合器.假设我要分类丰富,完善,不足的数字: USING: arrays assocs combinators formatting io kernel math math.order math.primes.factors math.ranges sequences ; IN: adp CONSTANT: ADP { "deficient" "
..
假设我在组合器解析器中表达的语言不明确.有没有办法使某些表达在局部上是贪婪的?这是我的意思的例子. import scala.util.parsing.combinator._ object Example extends JavaTokenParsers { def obj: Parser[Any] = (shortchain | longchain) ~ anyrep def
..
我最近使用Ply在Python中编写了一个解析器(这是yacc的python重新实现).当我几乎完成解析器的工作后,我发现我需要解析的语法要求我在解析过程中进行一些查找以告知词法分析器.如果不进行查询以通知词法分析器,就无法正确解析该语言中的字符串. 鉴于我可以从语法规则中控制词法分析器的状态,我想我将使用解析器模块中的查找表来解决用例,但是维护/测试可能变得太困难了.因此,我想了解其他一些
..