问题标签 [referential-transparency]
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.
functional-programming - 如何在功能上处理来自外部系统的状态?
我最近接触了函数式编程,并且学会了几种以引用透明的方式处理某些副作用的方法:
- 用于可变状态的 State monad ,例如更新变量
- 用于 I/O的 IO monad,例如从控制台读取/写入到控制台
- 用于图形和输入设备事件等交互性的FRP
但是现在大多数“现实世界”应用程序都与外部系统(如 Web 服务、数据库等)交互,这些系统可以由多个用户同时修改,它们具有状态、长时间运行的操作等。所以情况并不那么简单与上述类别一样:向系统询问实体的状态或试图控制它的结果取决于其状态。此外,交互性也是一个要求:有一些用户可以任意点击的 GUI,也许我们还必须自动响应来自系统的变化。
通过最大化纯函数的好处来设计和实现这类应用程序的模式是什么?或者上述一些方法可以以我没有想到的方式应用于这个问题吗?该语言(比如 Java 或 Scala)并不强制要求 100% 的纯度,所以我对实践经验支持的实用解决方案感兴趣。
api - 您如何与功能纯语言中的 API 连接?
我只是想知道如何在纯函数式语言中连接 API 而不会引入副作用?
algorithm - 纯函数集
有没有实现纯函数集的算法?
预期的操作将是union,intersection,difference,element ?,空?并毗邻。
不过,这些并不是硬性要求,我很乐意学习一种只实现其中一部分的算法。
haskell - 为什么使用外部范围定义的函数不会破坏引用透明性?
我正在学习 Haskell。如果我理解正确,Haskell 中的一个简单函数始终是引用透明的。我认为这意味着它的输出仅取决于传递给它的参数。
但是一个函数f
可以调用另一个函数g
,定义在外部范围内。所以从这个意义上说,f
的返回值取决于 的定义g
。并且该函数g
没有作为参数传递f
- 至少没有明确传递。这不会破坏引用透明度吗?
functional-programming - 参考透明度/功能纯度是最佳实践还是取决于偏好?
我想知道对于功能纯度是否被认为是最佳实践或者它是否取决于偏好或编程风格是否存在共识。换句话说,这是有争议的,还是有效地确定了?我能找到的所有信息都表明这是一种没有缺点的美德。这是真的?
我想为我们当地的实践社区编制一份最佳实践列表,并且我想知道应该在多大程度上包含这些实践。
haskell - 如何在 Data.Set 中插入 O(log(n))?
在查看 的文档时Data.Set
,我看到将元素插入树中被提到为 O(log(n))。但是,我直觉上希望它是 O(n*log(n))(或者可能是 O(n)?),因为引用透明性需要在 O(n) 中创建前一棵树的完整副本。
我知道例如(:)
可以使 O(1) 而不是 O(n),因为这里不必复制完整列表;编译器可以将新列表优化为第一个元素加上指向旧列表的指针(请注意,这是编译器 - 不是语言级别的 - 优化)。但是,将值插入 aData.Set
涉及重新平衡,这对我来说看起来很复杂,以至于我怀疑是否存在类似于列表优化的东西。我尝试阅读Set docs 引用的论文,但无法用它回答我的问题。
那么:在(纯)函数式语言中,如何将元素插入二叉树是 O(log(n))?
haskell - 为什么是 getArgs 和 getProgName IO 操作?
我是一个完整的新手,目前正在尝试通过“ Learn You a Haskell for Great Good ”来学习 Haskell。我已经到了解释如何使用命令行参数的部分,有些东西让我很烦。
根据我的理解(以及haskell.org 的定义),操作旨在封装副作用。命令行参数是程序给定实例的不可变输入,那么拥有getProgName :: IO String
而不是有什么意义getProgName :: String
呢?换一种说法:阻止纯函数调用有什么意义getProgName
?
更新
到目前为止,我对这个问题有一些很好的答案。我接受Don Stewart 的文章是最简单和简洁的,但Conal 的(及其相关的博客文章)绝对值得一读。
haskell - Haskell中具有多态性的引用透明性
说我有一个功能:
我想像这样抽象掉(+1):
这显然不会起作用,但如果我指定类型签名它将起作用:
假设我现在想通过将 h 作为参数传递来进一步抽象函数:
我收到一个错误,即内部 a 与外部 a 不同。
有谁知道如何正确编写这个函数?我想将多态函数传递g
给f
并以多态方式使用它。
我现在在非常不同的项目中多次遇到这种情况,我找不到一个好的解决方案。
haskell - Haskell - 如何在 IO 函数中使用纯函数?
如何在 IO 函数中使用纯函数?:-/
例如:我正在读取一个文件(IO 函数),我想通过使用具有引用透明性的纯函数来解析它的上下文,一个字符串。
似乎这样的世界,纯函数和 IO 函数,是分开的。我怎么可能桥接他们?
haskell - 在haskell计算中“注入”进度记录/跟踪?
我正在选择一个特定的任务来说明我在说什么
假设我天真地想找到一个大数的所有因子的总和——通过检查它下面的每个数字是否是一个因子,然后将它们加在一起。
在 IO 和纯计算之间没有分离的命令式编程语言中,您可能会做这样的事情
但是,如果我n
很大,我最终会在计算完成之前长时间盯着一个空屏幕。所以我添加了一些日志记录——
真的,这个添加是微不足道的。
现在,如果我要在教科书haskell中这样做,我可能会这样做
我遇到了和以前一样的问题......对于大量数字,我只是盯着空白屏幕一会儿。
但我不知道如何在 Haskell 代码中注入相同类型的跟踪/日志记录。我不确定,除了可能用显式递归重新实现折叠之外,以获得与命令式不纯代码中相同的跟踪模式/结果。
Haskell 中是否有教员可以做到这一点?一个不需要重构所有东西的?
谢谢