问题标签 [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 投票
1 回答
302 浏览

haskell - 不确定如何使用组合器设计有用的库

我一直在阅读有关组合器的文章,并看到它们有多么有用(例如,在 Haskell 的 Parsec 中)。我的问题是我不太确定如何实际使用它们。

这是问题的概要:可以生成、过滤和修改分布。可以组合分布以创建新分布。

基本接口是(在伪 Haskell 类型术语中):

现在,我认为我看到了三个组合器:

这些实际上是组合器吗?组合器是否有意义/我还缺少其他明显的组合器吗?

感谢您的任何建议。

0 投票
1 回答
189 浏览

regex - 如何编码对字符串值格式的约束

正如我经常观察到的以及我经常实现name属性的方式,将其简单地建模为String.

现在,如果名称必须遵循某种语法,即格式,该怎么办?在 Java 中,我可能会定义一个构造函数,并检查其参数,例如:

在 Scala 中,我提出了以下解决方案:

我的意图是:

  1. 从它的自然表示中组成a Name,即一个String
  2. 在构造时检查其自然表示是否形成有效Name
  3. 不允许通过工厂方法以外的任何其他构造apply:(str:Str)Str
  4. 使构造从其自然表示隐含,例如val a: Name = "ISBN 978-0-9815316-4-9"
  5. Name根据其句法元素将a 分解成各个部分。
  6. 有错误与消息一起抛出,例如:

===

我想知道你想出了什么解决方案。

在对该主题进行了更多思考之后,我目前正在采取以下方法。

令牌.scala:

令牌.scala:

0 投票
1 回答
1347 浏览

javascript - 用 JavaScript 中的 SKI-Combinators 表示 Y

当我偶然发现 Wikipedia 说:“Y 组合子可以在 SKI 演算中表示为:Y = S (K (SII)) ( S(S(KS)K)(K(SII)))”,所以我不得不尝试:

我究竟做错了什么?我没有正确翻译那个表达吗?我的处理方式有问题吗?它甚至有意义吗?大部分关于此类内容的阅读内容只会让我的大脑想要爆炸,所以这个练习的重点对我来说主要是看看我是否理解了这个符号(从而能够将它翻译成 JavaScript)。

哦,顺便说一句:让我再次阅读和摆弄的是prototype.js作为Prototype.K实现的实际上是I组合子。有没有人注意到?

0 投票
6 回答
941 浏览

haskell - 编写此代码的更短方法

以下模式在 Haskell 代码中经常出现。有没有更短的写法?

0 投票
1 回答
16954 浏览

functional-programming - 为工人解释组合器

什么是组合器??

它是“没有自由变量的函数或定义”(如 SO 所定义)?

或者这个怎​​么样:根据约翰休斯在他关于箭头的著名论文中的说法,“组合器是一个从程序片段构建程序片段的函数”,这是有利的,因为“......使用组合器的程序员构造了许多想要的自动编程,而不是手动编写每个细节”。他接着说,map并且filter是这种组合器的两个常见例子。

一些符合第一个定义的组合子:

一些符合第二个定义的组合子:

  • 地图
  • 筛选
  • 折叠/减少(大概)
  • >>=, compose, fmap 中的任何一个?????

我对第一个定义不感兴趣——那些不会帮助我编写一个真正的程序(如果你说服我我错了,+1)。 请帮助我理解第二个定义。我认为 map、filter 和 reduce 很有用:它们让我可以在更高层次上进行编程——更少的错误、更短和更清晰的代码。以下是我关于组合器的一些具体问题:

  1. 还有哪些组合器的示例,例如 map、filter?
  2. 编程语言经常实现哪些组合子?
  3. 组合器如何帮助我设计更好的 API?
  4. 如何设计有效的组合器?
  5. 什么是非函数式语言(比如 Java)中的组合子,或者这些语言用什么来代替组合子?

更新

感谢@CA McCann,我现在对组合子有了更好的理解。但是一个问题对我来说仍然是一个症结:

使用大量组合子编写的函数程序和不使用组合子编写的函数程序有什么区别?

我怀疑答案是重组合器的版本更短、更清晰、更通用,但如果可能的话,我希望能进行更深入的讨论。

我也在寻找fold常见编程语言中复杂组合子(即比 更复杂)的更多示例和解释。

0 投票
5 回答
5409 浏览

ruby - 像 tap 一样的组合方法,但能够返回不同的值?

我正在经历一个尝试避免临时变量和过度使用条件的阶段,我可以使用更流畅的编码风格。我非常喜欢#tap在我想要获得我需要返回的价值的地方使用它,但在我返回它之前做一些事情。

比。程序:

显然,上面的例子很简单,但这仍然是 ruby​​ 社区中非常常见的编码风格。我有时也会#inject通过一系列过滤器来传递一个对象:

比。程序:

现在我面临重复使用如下条件,并寻找一种更流畅的方法来处理它:

(稍微)干净的解决方案是以重复为代价避免临时变量:

尽管如此,我还是忍不住想要使用类似这里的东西。#tap

我可以在这里遵循哪些其他模式。我意识到这对某些人来说只是无意义的糖,我应该转向更有趣的问题,但我正在努力学习以更实用的风格写作,所以我只是好奇长期的 ruby​​ist 已经确定了什么成为解决此类情况的好方法。这些例子被大大简化了。

0 投票
2 回答
174 浏览

python - 这个组合器有名字吗?

这个函数 f 接受一个参数列表并返回另一个具有相同参数列表的可调用对象,以便其他函数可以应用于它。

你叫f什么?这是某种组合器吗?

0 投票
3 回答
861 浏览

haskell - 有“类型级组合器”吗?它们会在未来存在吗?

在我看来,使haskell 真正好用的大部分是组合符,例如,(.)等。感觉就像我可以在需要时创建新语法一样。flip$ <*>

前段时间我正在做一些事情,如果我可以“翻转”一个类型构造函数,那将非常方便。假设我有一些类型构造函数:

并且我有一个类MyClass需要一个带有 kind 类型构造函数的类型* -> *。自然,我会选择以我可以做到的方式对类型进行编码:

但是假设我无法更改该代码,并假设真正适合MyClass的内容类似于

然后我必须激活XTypeSynonymInstances. 有没有办法创建一个“类型级组合器” Flip,这样我就可以做到:

?? 还是我们在 haskell 中使用的常见运算符的其他类型级别的概括?这甚至有用还是我只是漫无目的?

编辑:

我可以做类似的事情:

但后来我不得不使用数据构造函数Flip, Dot, ... 来进行模式匹配等。值得吗?

0 投票
2 回答
1581 浏览

haskell - 什么是超级组合子和常量应用形式?

我正在为超级组合器是什么而苦苦挣扎:

超级组合子要么是一个常数,要么是一个仅包含超级组合子作为子表达式的组合子。

还有什么是常量应用形式

任何不是 lambda 抽象的超级组合器。这包括真正的常量表达式,例如 12、((+) 1 2)、[1,2,3] 以及部分应用的函数,例如 ((+) 4)。请注意,最后一个示例在 eta 抽象下等效于 \x -> (+) 4 x,后者不是 CAF。

这对我来说没有任何意义!不((+) 4)就像 12 一样“真正恒定”吗?在我简单的头脑中,CAF 听起来像是价值观。

0 投票
5 回答
623 浏览

haskell - 以无点风格编写函数的一般方案是什么?

目前我正在完成20 个中级 Haskell 练习,这是一个非常有趣的练习。Functor它涉及实现类型类和Monad(以及将Functors 和s 作为参数的函数)的各种实例,Monad但使用可爱的名称,例如FurryandMisty来掩饰我们正在做的事情(产生一些有趣的代码)。

我一直在尝试以无点的方式来做这件事,我想知道是否有一个通用的方案可以将有点(?)定义变成无点定义。例如,这是 的类型类Misty

(功能unicornbananareturn>>=,以防不明显)这是我的apple(相当于flip ap)的实现:

练习的后面部分让你实现版本liftMliftM2。这是我的解决方案:

现在,banana1(相当于liftMfmap)我能够通过合适的定义以无点风格实现appleTurnover. 但是对于其他三个函数,我不得不使用参数。

我的问题是:是否有将此类定义转换为无点定义的方法