问题标签 [purely-functional]
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.
data-structures - 这个简单的纯功能队列有效吗?
我在 Lisp (Scheme) 中开发了一个纯功能队列,如下所示:
delay-cons 类似于 cons,但它通过将尾部包装在闭包中来暂停对尾部的评估。delay-append 类似地(delay-append st)通过尾部的递归悬挂将 t 附加到 s。
因此,每个入队都包装了一层闭包,使其成为 O(1),每个 peek 只需检索一个使其成为 O(1) 的值,每个出队检索并评估一个闭包,使其成为 O(1)。
我在其他地方没见过这个;例如,在 Okasaki 的 Purely Functional Data Structures 中,最简单的队列是银行家队列,它比这复杂得多,并且只有分期 O(1) 的入队、窥视和出队。这让我怀疑我的推理有误。
这个数据结构合理吗?在某处有参考吗?
编辑: delay-cons 在这里的 delay-append 中使用是错误的;我正在尝试使用像宏这样的函数(感谢 Will Ness)。
我试图纠正它使用
但这不适用于 API。
c++ - 如何以纯粹的功能方式创建后端?
我正在用 C++ 练习纯函数式风格。一个大问题是如何有效地构建树形数据结构。尤其是后边缘。与超级节点的连接。这可以被认为是如何做一个参考。
在 C++ 中,人们简单地使用指针(或智能指针)作为后端,但 AFAIK,纯粹的功能(或引用透明)意味着它完全基于值,因此指针或引用不再意味着任何东西。
我知道这可以使用巨大的顶点/边表方法来解决,但它似乎效率很低,因为它本质上需要对每个操作进行查找。
有什么建议么?
我的问题不仅限于 C++。如果您知道用其他语言执行此操作的另一种方法,请告诉我。
recursion - Joel Spolsky 在变量值不变化和同时变化的悖论中是什么意思?
大约 8 个月前,我阅读了 Java Schools 的危险,从那时起,我一直将它用作我应该很快学习的东西的清单。我理解他所说的大部分内容。
然而,这部分我不太确定:
在纯函数式程序中,变量的值永远不会改变,但它一直在改变!一个悖论!
我从中得到的(如果我错了,请原谅我)是他在谈论递归,但递归似乎是
一个过于简单的概念。这是我的思路:
n
当您查看输出的内容时,尾递归函数中的值tail-rec
还没有改变,您会发现它实际上发生了变化。此外,由于函数本身不会改变
任何变量的状态,这意味着它是纯函数式的。
苏……
我说得对吗?
这就是乔尔所说的吗?如果没有,请纠正我。
functional-programming - 如何在纯函数式编程中执行副作用?
我现在处理函数式编程的概念有一段时间了,发现它非常有趣、迷人和令人兴奋。尤其是纯函数的想法在各个方面都很棒。
但是有一件事我没有得到:在将自己限制为纯函数时如何处理副作用。
例如,如果我想计算两个数字的和,我可以编写一个纯函数(在 JavaScript 中):
完全没有问题。但是如果我想将结果打印到控制台怎么办?从定义上看,“向控制台打印一些东西”的任务并不是纯粹的——但我怎么能/应该用纯粹的函数式编程语言来处理这个问题?
d - 在 D 中构建字符串的首选方式
关于函数属性以及父函数的编译@safe
时和运行时性能,构造字符串的首选方法是什么?pure
nothrow
例如,我们是否应该使用
或者
我认为该format
版本在视觉上更容易,但在其他方面更好吗?
由于格式字符串及其参数必须是 CTFEed,因此编译时间可能会对性能产生轻微影响,对吗?
f# - F# 可以为管理不确定性提供什么?
在与现实世界对话的应用程序中,使用非确定性函数是不可避免的。明确区分确定性和非确定性很重要。
Haskell 有一个 IO monad,它通过查看我们知道它之外的一切都是纯的来设置不纯的上下文。这很好,如果你问我,当涉及到单元测试时,你可以知道他们的代码的哪一部分最终是可测试的,哪一部分不是。
我找不到任何可以在 F# 中将两者分开的东西。这是否意味着没有办法做到这一点?
haskell - Haskell 中的纯函数是否可以改变变量的本地副本?
Haskell 中的纯函数是否有可能改变变量的本地副本,就像函数式编程是一个骗局中提到的 clojure 一样!,大卫·诺伦?如果不是,这是什么原因,如果是的话,有没有人可以指出我的例子?
在对调用者来说看起来很纯粹但内部使用突变的函数中提出了一个类似的问题,并且普遍的共识似乎是纯函数执行突变是可以的,只要突变是在变量的本地副本上执行的(即效果的突变不会逃避功能并具有非局部影响)。
当我将 Shen 中的冒泡排序(Local mutation, global mutation, mutable datastructures , Bubblesort in Qi)翻译为 common lisp 并与Common Lisp 中 Bubblesort 中的冒泡排序进行比较时,问题出现了,后者确实发生了变异名单。结果是我发现(在 Common Lisp 中),对于非常大的列表,改变列表的版本比没有改变列表的版本快得多。
.net - F# 中是否有任何用于突出显示纯函数或不纯函数的约定?
F# 中是否使用任何约定来突出显示纯函数和具有副作用的函数?
我已经看到 Contracts 命名空间中有一个 Pure 属性;但这看起来是 CodeContracts 的帮手。人们甚至会费心尝试在 F# 中突出显示纯函数吗?
data-structures - 二项式堆上的正确功能实现
我正在阅读Binomial Heap
Purely Functional Data Structures。
函数的实现insTree
让我很困惑。这是一组代码
我的困惑在于insTree
为什么它不考虑 rank t > rank t' 的情况?
在if rank t < rank t' then t::ts else insTree (link (t, t'), ts')
,
- 如果 t 的排名小于t 的排名,则将 t 放入堆中,不问任何问题
- else有两种情况:等于和更大。
- 对于equal,是的,我们可以链接两棵树(我们只链接两个具有相同等级的树),然后尝试将新链接的树插入堆中,没有问题。
- 但即使是更大的情况也会有相同的平等,为什么?即使 rank t > rank t',我们仍然链接它们吗?
编辑
我认为的过程inserting a binomial tree into a binomial heap
应该是这样的:
- 我们得到树 t 和堆
- 在堆(实际上是一个列表)中,我们将树 t 的排名与堆中的每棵树进行比较
- 我们找到一个与 t 的等级相匹配的缺失等级(堆中的递增顺序),我们将 t 放在那个位置
- 我们在堆中找到一棵与 t 具有相同等级的树,然后我们链接两棵树并处理一棵
rank+1
新树并再次尝试将新树插入堆中。
所以,我认为正确的fun insTree
可能是这样的:
caching - D中记忆函数的纯度
在 D 中记忆函数时,是否有任何巧妙的方法来保持纯度?
当缓存保存在 RAM 中的大型数据集的 SHA1 计算时,我想要这个。