问题标签 [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.
clojure - 在 Clojure 中处理数据库读取
我正在尝试“净化”我的一些 Clojure 函数。我想达到一个点,即我所有的副作用代码都在一个函数中显式声明。在开始时获取一些数据并在结束时将其写入数据库很容易,并且在两者之间只有一个纯函数转换。但是,通常的情况是转换函数需要在逻辑中间某处读取另一个 DB:
显然这是一个非常简单的例子,但重点是,我如何从那里获得副作用db/read
功能,我怎样才能使transform-users
纯(并且作为一个好处,易于测试)?
data-structures - 为什么可连接列表的 append 和 uncons 仅摊销 O(1)?
我采用了 Okasaki 的可连接列表实现,并对其进行了一些重构以避免布尔盲问题。除此之外,数据结构本身保持不变:
在他的书中,Okasaki 声称,给定具有O(1)
操作的队列的实现(最坏情况或摊销),append
并且uncons
是摊销的O(1)
。
为什么他的主张不能得到加强?给定实时队列的实现(所有操作都是最坏情况O(1)
),append
在我uncons
看来是最坏情况O(1)
。所有递归调用linkAll
都由 保护L.delay
,并且没有任何公共操作会强制暂停一次以上。我的推理(或我的代码)错了吗?
haskell - Haskell:对于 Map 中的每个 (k,v),使用 k 和 v 执行 IO()
我有一个Map (Int,Int) Char
,我正在尝试将其中的每个Char
s 绘制在键中包含的位置。我的职能是:
在线drawMirrors mirrors = do mapM_ (\(x,y) c -> drawMirror c (Position x y)) mirrors
上,我收到错误消息:
如何在drawMirrors
中获取字典中的所有键和值并drawMirror
使用这些键和值应用函数?
haskell - Haskell:具有不对称构造函数的 if-then-else 块和数据
我有以下数据可以有或没有船:
然后,稍后,我尝试检查 LaserCollisionResult 是否属于 LaserToLaserCollision 类型,但出现错误。我的 lambda 函数是这样的:
我得到的错误是:
如何检查laserCollisionResults 中的LaserCollisionResult 是否属于LaserToLaserCollision 类型?
clojure - “rerootable”纯功能树数据结构
我最近购买了 Joseph Felsenstein 的《推断系统发育》,这是一本关于推断系统发育树的数学和计算方法的好书,并且一直在尝试实现它所描述的一些算法。
具体来说,我有兴趣在具有持久性数据结构的功能设置中这样做,因为许多方法都涉及遍历可能的树空间,并且通过结构来廉价地记住我们去过的地方的历史会很好共享(这是 aphyr 在这篇博文中对“世界”所做的事情)、轻松缓存先前计算的子树值等。
这样做的问题是,很多方法都涉及“重新生根”树,我无法弄清楚如何以纯粹的功能方式廉价地做到这一点。基本上我需要一些方法来捕捉以下每一个的想法(使用 clojure 表示法,将树表示为向量):
表示相同的数据,仅在根的位置不同;它们各自代表无根树:
我希望能够使用 zipper 导航到其中一棵树,然后调用一个函数reroot
,该函数将返回一个新树,该树以这样一种方式压缩,即根位于 current loc
。
在书中,Felsenstein 描述了一种用于廉价可重根树的数据结构,它看起来像下面匆忙制作的图表
其中圆圈是结构,箭头是指针。结构环是树上的内部节点,一旦我们引用了一个,我们可以通过一些指针交换将根移到那里。不幸的是,这是一个变异操作,需要相互引用,这两者在纯函数设置中都是不可能的。
我觉得应该有一种方法可以使用拉链做我想做的事,但我已经玩clojure.core/zip
了一段时间了,却一无所获。
有谁知道这样的实现,或者对我应该阅读的东西/我应该看的论文/如何做到这一点的想法有建议?
谢谢!
haskell - 嵌套纯函数中的随机性
我想提供一个函数,用#
不同的随机数替换字符串中的每次出现。在非纯语言中,这是微不足道的。但是,应该如何用纯语言设计呢?我不想使用unsafePerformIO
,因为它看起来像是 hack 而不是正确的设计。
该函数是否需要随机生成器作为其参数之一?如果是这样,该生成器是否必须通过整个调用堆栈?还有其他可能的方法吗?我应该在这里使用State
单子吗?我将不胜感激一个展示可行方法的玩具示例...
python - 检查 Python 包的内容而不运行它?
我想要一个函数,给定name
导致 a 的 a NameError
,可以识别可以import
用来解决它的 Python 包。
这部分相当简单,我已经完成了,但现在我还有一个问题:我想这样做而不引起副作用。这是我现在正在使用的代码:
问题是这段代码实际上__import__
是每个模块。这意味着导入每个模块的每一个副作用都会发生。在测试我的代码时,我发现导入所有模块可能导致的副作用包括:
- 启动 tkinter 应用程序
- 请求密码
getpass
- 要求其他
input
或raw_input
- 打印信息 (
import this
) - 打开网站 (
import antigravity
)
我考虑的一个可能的解决方案是找到每个模块的路径(如何?在我看来,唯一的方法是通过import
模块然后使用inspect
它上面的一些方法),然后解析它以找到每个class
, def
,并且=
它本身不在 a class
ordef
中,但这似乎是一个巨大的 PITA,我认为它不适用于用 C/C++ 而不是纯 Python 实现的模块。
另一种可能性是启动一个子 Python 实例,该实例将其输出重定向到devnull
那里并在那里执行检查,如果花费的时间太长,则将其杀死。这将解决前四颗子弹,而第五颗子弹是如此特殊,我可以跳过antigravity
。但是不得不在这个单一函数中启动数千个 Python 实例似乎有点……繁重且效率低下。
有没有人有我没有考虑过的更好的解决方案?例如,有没有一种简单的方法可以告诉 Python 生成 AST 或其他东西而不实际导入模块?
f# - 如何在 F# 中实现“提前返回”逻辑
我熟悉在 F# 中没有等效的“return”关键字这一事实。
然而,我们最近遇到了一个问题,我们需要一个包含许多步骤的工作流程,其中每个步骤都可以返回一个好的或坏的结果。如果在任何步骤中发现错误结果,我们希望退出工作流程 - 并提前退出!
我们通过有效地检查每个步骤(即函数)中的错误来解决它,但我认为这不是正确的方法 - 它效率低下,我们不会提前退出。
工作流中的示例函数如下:
工作流程本身如下所示:
所以每个样本函数都会接受前一个函数的结果,并且只有在没有错误的情况下才执行当前步骤!
我遇到的问题是,如果 StepA 因错误而失败,则仍会调用所有其他步骤。
是否有一种“提前返回”的“功能性”方式,而不是调用工作流中的每个函数,我们必须每次都检查错误?
php - PHP 按值传递对象
我想在 PHP 中实现一个纯函数
如何通过值而不是引用传递对象?
换句话说,这是预期的输出: