问题标签 [combinators]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - 在 Haskell 中实现 Smullyan 的算术鸟
在搜索有关 Raymond Smullyan 的To Mock a Mockingbird的信息时,我偶然发现了Stephen Tetley 的基本组合器的 Haskell 代码。我认为这是一个有趣的想法,并决定使用这些组合器来实现To Mock a Mockingbird第 24 章中的“可以做算术的鸟”。我已经定义了真、假、继任者、前任和零校验组合器,以及将组合布尔值更改为 Haskell 布尔值的函数,反之亦然。但是当我尝试创建一个接受组合数字并返回整数的函数时,我一直遇到问题。我想知道如何使这个功能工作。这是我到目前为止所得到的:
这是我对代码问题的粗略猜测:“cnhn”函数将任何组合数字作为参数。但是不同的组合数有不同的类型,比如
零)id' :: a -> a
一)vr(ke id')id' :: ((a -> b -> b) -> (c -> c) -> d) -> d
二)vr(ke id')(vr(ke id')id') :: ((a -> b -> b) -> (((c -> d -> d) -> (e -> e ) -> f) -> f) -> g) -> g
等等。因此,将任何组合数作为参数的函数必须能够采用无限多种类型的参数。但是 Haskell 不允许这样的功能。
简而言之,这是我的 3 个主要问题:
1) 'cnhn' 函数有什么问题?(我上面的猜测正确吗?)
2)可以修复吗?
3)如果不是,我可以使用什么其他语言来实现 Smullyan 的算术鸟?
感谢您阅读一个很长的问题。
javascript - 单击元素时应用新的 CSS 规则
scala - `forever` 组合器上的 StackOverflow
查看来自Scala 函数式编程forever
的组合器:
正如书中解释的那样,我遇到了 StackOverflow。
然后,我添加了一个count
变量,每次t
访问时递增它:
然后,我创建了一个 ScalaTest 测试:
运行上述测试 3 次后,每次都在 ~1129/1130 上失败。
为什么它在崩溃之前达到这个数字?另外,我如何推断每次执行forever
占用了多少堆栈内存?
json - 使用 Play 的 (2.2) Scala JSON 组合器编写在案例类中未找到的任意值
我想实现一个Writes
发出一个在被序列化的类中找不到的 JSON 对象。
对于案例类:
我正在寻找生产:
天真的第一次尝试是:
自然,这不会编译,因为后续and
调用会产生 aCanBuild3
并且Foo
'unapply
会产生 a Tuple2
。我曾考虑在结果中附加一个值,生成一个Tuple3
,但我发现看起来很糟糕,语言维护者不会实现它。
有一些方法可以解决这个问题,但我不想用我想添加到结果 JSON 中的这些装饰器值污染我的模型类。
有什么建议么?
值得注意的是,您可以转向另一个方向,为Reads.pure
JSON 中不存在值但由结果对象指定的情况提供值。
haskell - Haskell中的S组合器
可以仅使用标准函数(不通过方程式定义它)而不使用 lambda(匿名函数)在 Haskell 中表达S组合器的模拟吗?我希望它是 type (a -> b -> c) -> (a -> b) -> a -> c
。
例如,K组合子的模拟就是const
.
事实上,我正在尝试\f x -> f x x
使用标准函数来表达函数,但想不出任何标准的非线性函数开始(即多次使用其参数的函数)。
javascript - 如何在 CoffeeScript 中只执行一次函数
我想制作一个 CoffeeScript 函数,即使它被多次调用,它的效果也只运行一次。
其中之一,还是另一种方式是制作一次可调用函数的好方法?额外do
是一个问题还是实际上更好?
我知道http://api.jquery.com/one/和http://underscorejs.org/#once但在这种情况下使用这些库不是一种选择。
functional-programming - 实现组合器演算
概念
我正在实现一个解释器,它允许用户定义任意组合器并将它们应用于任意术语。例如,用户可以通过输入以下组合子定义来定义对的Church 编码:
然后用户可以输入first (pair a b)
,根据之前定义的规则逐步减少:
也可以定义其他组合子,例如在SKI 组合子演算中使用的那些:
身份组合器也可以根据前两个组合器由I → S S K K
orI → S K (K K)
或来定义I = S K x
。然后可以通过以下方式定义通用iota 组合器:
这些例子希望能说明我正在尝试做的事情。
执行
我正在尝试使用图形缩减和图形重写系统来实现这一点。让tree
是递归定义的数据类型
这是一棵二叉树,其中节点可以是叶子(终端节点)或由一对子树组成的分支(内部节点)。分支代表一个术语对另一个术语的应用,而叶子代表组合子和参数。让我们rule
定义一个数据类型
这对应于将左树转换为右树 (a → b) 的归约规则。的列表rules
然后可以定义为
有效地,当评估一个表达式时pair a b c → c a b
,解释器构造一棵(((pair a) b) c)
对应于左侧形式的树,一棵对应于右手边形式的树((c a) b)
,构造一对对应于 a 的两棵树rule
(其中a,b,c
以某种方式指定是任意参数,不一定是组合符或终结符号),并将这对附加到列表中rules
。当减少形式的表达时first (pair a b)
,解释器构造相应的树(first ((pair a) b))
并应用归约规则,如下所示:
为此,解释器必须对树及其子树执行模式匹配,“移动”组合子和任意参数以构造对应于规则右侧的新树。C中树结构的示例实现由下式给出
模式匹配函数可以实现为
但是,我不确定如何实施此过程的重要细节,包括:
- 将输入树与归约规则的 LHS 树匹配。
- 将输入树转换为归约规则的 RHS 树,保留参数(可能是树叶或树枝)并将它们“移动”到适当的位置。
我相信节点上的模式匹配将涉及检查节点的左孩子和右孩子等等,直到到达终端节点。有谁知道在 C 中实现了类似概念并且我可以从中学习的在线程序或教程?通过这种方法解决问题,我是否走在正确的轨道上,还是有更简单的方法?
haskell - HXT 中的逻辑或,不重复结果
我在使用HXT时遇到了一点麻烦:我正在尝试在文档中找到与某些条件匹配的所有节点,并且我正在尝试以类似 OR 的方式将 lens/XPaths 组合为谓词,使用Control.Arrow.<+>
, 就像这样指南建议。但是,当我尝试“运行”文档上的箭头时,我得到了重复的结果。有没有一种简单的方法可以删除重复项,或者以更有意义的方式组合测试?这是我的代码:
然而,每次我运行它(在任何网页上),我都会得到重复的结果/节点。我注意到它<+>
是ArrowPlus 类型类的一部分,它模仿了一个幺半群,而ArrowXML是ArrowList和ArrowTree的一个实例,这给了我很多工作要做。我是否必须构造ArrowIf谓词?对此的任何帮助都会很棒:)
scala - Is there maximum number of Validations that can be combined with combinator?
I'm trying to use Scalaz (scala 2.10, version 7.1 of ScalaZ) for validations. I have a case class with 13 fields, so I end up with 13 validations. I'm using the combinator to combine all of the validations and build the class if all are successful. If there are just 12 combinators, everything is fine. When I add the 13th, I get a message saying that "value |@| is not a member of scalaz.syntax.ApplicativeBuilder".
To reproduce, I fired up the REPL and tried to combine 12 items:
works just fine. I then tried to combine 13 items:
Is there another way to combine all of the validations?
haskell - Pointfree 版本无法编译,但有针对性的版本可以吗?
我想编写一个 Haskell 函数,它返回一个附加到自身计数时间的列表(就像lst * count
在 Python 中一样)。
我的第一次尝试是:
我的推理是replicate
接受一个计数和一个值,并产生一个值列表。当值本身是一个列表时,剩下的就是将这些列表连接在一起。但是,这会产生一个令人困惑的错误:
然后我写了一个有意义的版本:
它有效!
为什么免点版本编译失败,加点就可以了?