问题标签 [functional-programming]

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 投票
8 回答
10188 浏览

c# - 什么时候使用闭包?

我已经看到了关闭样本 -什么是“关闭”?

谁能提供何时使用闭包的简单示例?

具体来说,在哪些情况下关闭是有意义的?

让我们假设该语言没有闭包支持,如何仍然实现类似的事情?

为了不冒犯任何人,请以 c#、python、javascript、ruby 等语言发布代码示例。
对不起,我还不懂函数式语言。

0 投票
15 回答
19224 浏览

c# - C# 中的不可变对象模式 - 你怎么看?

在几个项目的过程中,我开发了一种用于创建不可变(只读)对象和不可变对象图的模式。不可变对象具有 100% 线程安全的优点,因此可以跨线程重用。在我的工作中,我经常在 Web 应用程序中将这种模式用于配置设置以及我在内存中加载和缓存的其他对象。缓存对象应该始终是不可变的,因为您希望确保它们不会被意外更改。

现在,您当然可以轻松地设计不可变对象,如下例所示:

这对于简单的类来说很好——但对于更复杂的类,我不喜欢通过构造函数传递所有值的概念。在属性上有设置器更可取,并且构建新对象的代码更易于阅读。

那么如何使用 setter 创建不可变对象呢?

好吧,在我的模式中,对象一开始是完全可变的,直到你用一个方法调用冻结它们。一旦一个对象被冻结,它将永远保持不可变——它不能再次变成一个可变对象。如果您需要对象的可变版本,您只需克隆它。

好的,现在开始一些代码。我在以下代码片段中尝试将模式归结为最简单的形式。IElement 是所有不可变对象最终必须实现的基本接口。

Element 类是 IElement 接口的默认实现:

让我们重构上面的 SampleElement 类来实现不可变对象模式:

您现在可以通过调用 MakeReadOnly() 方法更改 Id 属性和 Name 属性,只要该对象未被标记为不可变。一旦它是不可变的,调用 setter 将产生 ImmutableElementException。

最后说明:完整模式比此处显示的代码片段更复杂。它还包含对不可变对象集合和不可变对象图的完整对象图的支持。完整模式使您可以通过调用最外层对象的 MakeReadOnly() 方法将整个对象图变为不可变。一旦开始使用这种模式创建更大的对象模型,泄漏对象的风险就会增加。泄漏对象是在对对象进行更改之前未能调用 FailIfImmutable() 方法的对象。为了测试泄漏,我还开发了一个用于单元测试的通用泄漏检测器类。它使用反射来测试是否所有属性和方法都将 ImmutableElementException 抛出为不可变状态。换句话说,这里使用了 TDD。

我已经非常喜欢这种模式,并从中发现了巨大的好处。所以我想知道的是你们中是否有人使用类似的模式?如果是,您是否知道任何记录它的好资源?我本质上是在寻找潜在的改进以及在这个主题上可能已经存在的任何标准。

0 投票
22 回答
31888 浏览

haskell - Why is lazy evaluation useful?

I have long been wondering why lazy evaluation is useful. I have yet to have anyone explain to me in a way that makes sense; mostly it ends up boiling down to "trust me".

Note: I do not mean memoization.

0 投票
3 回答
661 浏览

functional-programming - 函数式更新

这可能是矛盾的,但是如何以函数式编程风格更新数据实体?从我读过的所有内容来看,函数式编程使用转换来返回不可变实体的输出。我唯一能想到的就是完全替换原始实体,但这似乎与经典更新方法几乎相同。

0 投票
3 回答
508 浏览

f# - 我如何针对列表执行 car 和 cadr?

假设我有一些代码:

使用 Lisp 表示法,我如何做一个carcadr反对这个列表?我知道缺点是::

或者在Scheme中,firstrest

0 投票
5 回答
1573 浏览

database - 失忆症患者的“第一”功能性语言?(我真的很喜欢 Clojure ......)

我最近被诊断出患有级联分离障碍,除了现有的可能的顺行性健忘症病例外,还会导致逆行性健忘症。许多人试图提醒我,我以前是一个多么伟大的程序员——现在我知道了概念和习语,但无论我是否知道,我都想自学。我想我可以部分克服健忘症的问题。

我的问题是,stackoverflow,我最近发现了 Clojure,它......使用起来感觉很好,即使只是从我能找到的任何网页上复制示例。我学习函数式编程语言的目标是创建一个简单的网络服务器、一个 irc AI bot 和一个类似 couchdb 的数据库系统,所有这些都是轻量级的,专门用于教育。Clojure 有哪些缺陷?现在是否有更好的函数式编程语言可用于教育/和/应用程序?

0 投票
9 回答
1669 浏览

functional-programming - 函数式编程是自然语言编程的下一步吗?

这是我的第一个问题,所以我有点紧张,因为我不确定我是否理解得足够好。无论如何,我们走吧......

每当达到编程的新里程碑时,似乎他们总是有一个共同目标:让程序员更容易编程。

机器语言、操作码/助记符、过程/函数、结构、类 (OOP) 等总是有助于以更自然、更易于理解和更好维护的方式规划、构造和编码程序。

当然,函数式编程绝不是新鲜事物,但近年来它似乎经历了某种复兴。我也相信,当微软将 F# 添加到他们的主流编程语言中时,FP 将得到巨大的推动。

回到我最初的问题,我相信最终编程将使用自然语言(英语)完成,几乎没有限制或规则。编译器将成为 AI/NLP 系统的一部分,该系统从代码中提取信息,或者我应该说文本并将其转换为编译器可以编译的中间语言。

那么,FP 是让编程更接近自然语言编程,还是它是一个障碍,主流 OOP 会引导我们更快地走向自然语言编程?

这个问题不应该用来讨论自然语言编程的可用性或可行性,因为只有未来才能证明。

0 投票
3 回答
552 浏览

functional-programming - 有没有类似功能模型的东西?

在面向对象的范式中,我会在开始使用 OO 语言实现它之前创建一个对象/概念模型。

函数式编程中是否有任何与对象模型平行的东西。它被称为功能模型吗?或者我们在两种范式中创建相同的概念模型,然后用其中一种语言实现它。

如果存在功能模型,是否有文章/书籍可以阅读?

或者换一种说法……即使我们使用的是函数式编程语言,我们会从对象模型开始吗?

0 投票
4 回答
1655 浏览

algorithm - 函数式语言的快速元素查找(Haskell)

假设我们正在遍历一个图,并且想要快速确定一个节点之前是否出现过。我们有一些设定的先决条件。

  1. 节点已用整数值 1..N 标记
  2. 图是用具有邻接列表的节点实现的
  3. 1..N 中的每个整数值都出现在图中,其大小为 N

以纯功能方式执行此操作的任何想法?(不允许哈希表或数组)。

我想要一个有两个函数的数据结构;add(添加遇到的整数)和查找(检查是否添加了整数)。两者都应该优选地花费 O(n) 时间来分摊 N 次重复。

这可能吗?

0 投票
4 回答
1128 浏览

functional-programming - 是否有支持可移植延续的快速语言?

我正在寻找一种支持可移植延续的快速语言(即一种可以本地编译以实现性能不超过 C 3 或 4 倍的语言)。我的意思是可以在一台计算机上序列化并在另一台计算机上反序列化的延续。

我知道 SISC 可以做到这一点(Java 中的 Scheme 实现),但速度很慢。同样适用于 Rhino(Java 中的 Javascript 实现)。