问题标签 [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.

0 投票
18 回答
122000 浏览

functional-programming - 什么是 Y 组合器?

Y 组合器是从事物的“功能”方面来看的计算机科学概念。大多数程序员对组合子一无所知,即使他们听说过它们。

  • 什么是 Y 组合器?
  • 组合器如何工作?
  • 它们有什么用?
  • 它们在程序语言中有用吗?
0 投票
6 回答
5612 浏览

python - Parsec 的 Python 实现?

我最近使用 Ply 在 Python 中编写了一个解析器(它是 yacc 的 Python 重新实现)。当我几乎用完解析器时,我发现我需要解析的语法需要我在解析过程中进行一些查找以通知词法分析器。如果不进行查找以通知词法分析器,我将无法正确解析该语言中的字符串。

鉴于我无法从语法规则中控制词法分析器的状态,我想我将使用解析器模块中的查找表来解决我的用例,但维护/测试可能变得太难了。所以我想知道其他一些选择。

在 Haskell 中,我会使用 Parsec,一个解析函数库(称为组合子)。是否有 Parsec 的 Python 实现?或者也许是其他一些具有解析功能的生产质量库,以便我可以在 Python 中构建上下文敏感的解析器?

编辑:我所有的上下文无关解析尝试都失败了。出于这个原因,我不希望 ANTLR 在这里有用。

0 投票
8 回答
11316 浏览

function - “组合器”的好解释(非数学家)

有人对“组合器”(Y-组合器等而不是 公司)有很好的解释吗?

我正在寻找一位了解递归和高阶函数但没有强大理论或数学背景的实用程序员。

(注意:我说的是这些东西

0 投票
7 回答
5559 浏览

haskell - 使用 foldr 实现 zip

我目前正在阅读 Real World Haskell 的第 4 章,我正试图围绕使用 foldr 来实现 foldl

(这是他们的代码:)

我想我会尝试zip使用相同的技术来实现,但我似乎没有取得任何进展。甚至可能吗?

0 投票
1 回答
1611 浏览

scala - Scala 组合器解析器 - 区分数字字符串和变量字符串

我正在做 Cay Horstmann 的组合解析器练习,我想知道在匹配语句中区分表示数字的字符串和表示变量的字符串的最佳方法:

第二行,“case a: wholeNumber”是不合法的。我想过一个正则表达式,但还没有找到一种方法让它与“案例”一起工作。

0 投票
4 回答
794 浏览

haskell - 这是编写 Haskell foldr 函数的正确方法吗?

我在YAHT 的 Recursive Datatype部分做练习,发现编写listFoldr函数有点挑战性(主要是因为我一开始并没有真正理解和之间的区别foldlfoldr。当我最终确切地意识到该foldr函数是如何工作的时,我决定只需简单地交换函数参数即可将我listFoldl的函数更改为listFoldr函数:

这似乎有效(我做了比这更多的测试):

但是为练习给出的解决方案与我的大不相同。他们listFoldl和我的完全一样,但是看看他们的listFoldr

哪种解决方案更好,我的还是他们的?其中之一不正确吗?(在我的测试中,它们最终都得到完全相同的结果......)

0 投票
4 回答
1127 浏览

ruby - Ruby <=> 组合器的实现

经常有人想要<=>在产品数据类型上实现(比较,或“宇宙飞船”)运算符,即具有多个字段的类(所有这些(我们希望!)已经<=>实现),比较某个字段中的字段命令。

这既乏味又容易出错,尤其是对于很多领域。它很容易出错,以至于我经常觉得我应该对该函数进行单元测试,这只会增加乏味和冗长。

Haskell 提供了一种特别好的方法:

(对于那些不熟悉的人fold,以上扩展为

它产生一个可应用于两个Ds 的函数,以产生一个Ordering.)

的定义compareD非常简单,显然是正确的,即使没有静态类型检查,我也不觉得需要对其进行单元测试。

实际上,这个问题可能比这更有趣,因为我可能不想只使用标准<=>运算符,而是在不同的时间以不同的方式排序,例如:

所以,问题:

  1. 在 Ruby 中实现这类事情的典型方法是什么?
  2. 仅使用标准库中定义的内容最好的方法是什么?
  3. 相比之下,与上面的 Haskell 代码有多接近,它的可靠性如何?如有必要,如何确保字段具有正确实施的<=>or<>运算符?

顺便说一句,虽然这是一个 Ruby 问题,但如果该站点的长辈们同意,我很高兴考虑讨论有关 Haskell 技术的主题。请随时评论这是否合适,如果合适,请将此帖子标记为“haskell”。

0 投票
5 回答
1511 浏览

haskell - 什么是 zygo/meta/histo/para/futu/dyna/whatever-morphisms?

如果没有广泛的范畴理论知识的人可以访问它们的示例,是否有一个列表?

0 投票
2 回答
186 浏览

xml - 在 Ruby 中解析 XML 标记时如何获取所有内容的总和?

我有一些这样的 XHTML(但实际上任何 XML 都可以):

如何<h1/>在 Ruby 中获取 as a String 的全部内容?如:

是否有任何 XML 框架(Nokogirilibxml-ruby等)内置了这种东西?如果不是,我觉得 Y-Combinator 可能是适合这项工作的工具,但我不太清楚它会是什么样子。

0 投票
4 回答
7261 浏览

haskell - Haskell:“groupBy”的令人惊讶的行为

我试图弄清楚库函数 groupBy(来自 Data.List)的行为,它声称通过作为第一个参数传入的“平等测试”函数对列表的元素进行分组。类型签名表明相等测试只需要有类型

但是,当我在 GHCi 6.6 中使用 (<) 作为“平等测试”时,结果不是我所期望的:

相反,我希望运行数量严格增加,如下所示:

我错过了什么?