问题标签 [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.
data-structures - 具有多个游标的拉链式数据结构
当一个人想要遍历一棵树并保持当前位置时,Zipper 数据结构很棒,但是如果他们想要跟踪一个以上的位置,应该使用什么数据结构呢?
让我用例子来解释:
- #haskell 频道上有人告诉我,yi 编辑器中使用拉链来表示光标位置。这很好,但是如果你想有两个游标怎么办。就像如果你想代表一个选择,你需要知道选择的开始和结束。
- 在 wikibooks 上的 Minotaur 示例中,他们使用 Zipper 来表示 Minotaur 在迷宫中的位置。如果我想将敌人添加到迷宫中,用拉链代表他们的位置同样有意义。
- 最后一个实际上是从我的迷你项目开始的:作为学习 Haskell 的一部分,我正在尝试使用 cairo 和 gth2hs 可视化树结构。到目前为止一切顺利,但现在我想选择一个或多个节点并能够例如移动它们。因为可以有超过一个选定的节点,所以我不能只使用教科书中定义的 Zipper。
有一个简单的(天真的?)解决方案,类似于他们在 XMonad 的早期版本中使用的解决方案,其中涉及有限映射,如此处所述。
也就是说,例如在我的示例项目中,我会将选定的节点存储在索引映射中,并用索引替换它们在主结构中的表示。但是这种解决方案有很多缺点。就像上面链接中解释的那样,或者说,在我的示例中,取消选择所有节点将需要搜索整个树。
scala - 使用函数编程语言处理具有内部状态的外部库的最优雅方法是什么?
我目前正在玩 Scala 开发,但我需要与 box2d 等库集成来处理物理。问题是这需要依赖于管理自己状态的外部库。你跟踪你传入 box2d 世界的物体。总结一下游戏中的各个方面:
- Box2d 管理世界中的状态并在每个滴答/步骤后修改它们
- 您创建(使用 FP)传递到这个世界的身体
- Box2d 在内部修改这些物体的状态
- 要跟踪对象,请保留对它们的引用
- 您很可能希望使用正文中的信息来呈现您的代码,因此我认为跟踪该信息的唯一方法是跟踪可变集合中的所有引用。它需要在所有帧中存活。
所以我的问题是:
您如何以优雅的方式(用于函数式编程)跟踪这些引用,以及如何将其对其余代码纯度的影响降至最低?
我猜像状态单子这样的东西在这里对我没有帮助
functional-programming - 函数式语言如何模拟副作用?
由于副作用破坏了引用透明度,它们不违背函数式语言的观点吗?
haskell - 为什么惰性与引用透明性相得益彰?
我正在阅读 Haskell 教程(Learn You a Haskell),其中作者说惰性与引用透明性相得益彰。经过更多的阅读和一些搜索,我仍然不明白为什么。请注意,我确实了解引用透明性和惰性的优点,但让我感到困扰的是它们在一起。
两者结合有什么特别的好处吗?
或者也许作者只是想说他们都很好,但表达得模棱两可?
exception - 如何捕获(并忽略)对错误函数的调用?
我很惊讶我在任何地方都找不到答案。
我正在写一个 roguelike,我正在使用来自 hackage 的 ncurses 库,它是 ncurses 库的一个非常好的包装器。现在 ncurses 有这个怪癖,如果你尝试写右下角的字符,它会这样做,然后它会尝试将光标移动到下一个字符,然后它会失败,因为无处可移动。它返回一个您只能忽略的错误值。
我的问题是haskell ncurses库编写者尽职尽责地检查所有调用中的任何错误,当有错误时,他调用:错误“drawText:etc etc.”。
在其他语言中,如 c 或 python,为了解决这个问题,你不得不忽略错误或捕获并忽略异常,但对于我来说,我无法弄清楚如何在 haskell 中做到这一点。误差函数不可恢复吗?
如果必须,我将在本地修改库以不检查该函数的错误,但我讨厌这样做。我也愿意接受任何允许我在不移动光标的情况下绘制最后一个字符的解决方法,但我认为这是不可能的。
java - 是否有处理器/插件可以在 Java 中强制执行参照透明、不可变等?
看起来很简单:例如,如果有任何非最终字段访问,处理器会在一个类上使用 @Immutable 。它必须确保所有合作者也是不可变的。
可以将@ReferentiallyTransparent(更好的名称?)放在方法上,然后检查以确保所有调用和协作者也被标记为@RefTrans 和@Immutable ...
haskell - 可以用 IO 代码扩展纯函数吗?
我在 Haskell 中编写了一个简单的 XML 解析器。函数convertXML接收 XML 文件的内容并返回进一步处理的提取值列表。
XML 标签的一个属性还包含产品图片的 URL,如果找到标签,我想扩展该功能以下载它。
知道如何在getImgName函数中插入 IO 代码,还是必须将 convertXML 函数完全重写为不纯的版本?
更新二 convertXML 函数的最终版本。卡尔建议的混合纯/不纯但干净的方式。返回对的第二个参数是一个 IO 操作,它运行图像下载并保存到磁盘,并包装存储图像的本地路径列表。
scala - 参考透明度
在函数式编程中与术语“引用透明”一起使用时,术语“不可观察”是什么意思?
language-agnostic - 纯度与参考透明度
这些术语的定义似乎确实 不同,但我一直认为一个暗示另一个;我想不出任何情况下表达式是引用透明但不纯的,反之亦然。
维基百科为这些概念维护了单独的文章,并说:
从参考透明度:
如果表达式中涉及的所有函数都是纯函数,则表达式是引用透明的。此外,如果某些不纯函数的值被丢弃并且它们的副作用微不足道,则可以将它们包含在表达式中。
从纯表达式:
纯函数是构造纯表达式所必需的。[...] 纯表达式通常被称为引用透明的。
我发现这些陈述令人困惑。如果所谓的“不纯函数”的副作用微不足道,以至于不允许在不实质性更改程序的情况下不执行它们(即用它的值替换对此类函数的调用),那么它就好像它是纯的一样第一,不是吗?
有没有一种更简单的方法来理解纯表达式和引用透明表达式之间的区别(如果有的话)?如果存在差异,将不胜感激提供一个清楚地证明它的示例表达式。
haskell - Haskell中的随机枢轴快速排序
是否可以在仍然具有简单Ord a => [a]->[a]
签名的 Haskell(使用 RANDOM-PIVOT)中实现快速排序?
我开始理解 Monad,现在,我将 monad 解释为某种“命令模式”,这对 IO 非常有用。
所以,我知道一个返回随机数的函数实际上应该返回一个像 IO 这样的一元值,因为否则它会破坏引用透明度。我也明白应该没有办法从返回的一元值中“提取”随机整数,否则,它会再次破坏引用透明度。
但是,我仍然认为应该可以实现一个“纯”[a]->[a]
快速排序功能,即使它使用随机枢轴,因为它是引用透明的。从我的角度来看,随机枢轴只是一个实现细节,不应该改变函数的签名
OBS:我实际上对特定的快速排序问题并不感兴趣(所以,我不想听起来很粗鲁,但我不是在寻找“使用合并排序”或“随机枢轴不会提高实践中的性能”之类的答案)我实际上对如何实现一个在其中使用“不纯”函数的“纯”函数感兴趣,在快速排序等情况下,我可以确保该函数实际上是一个纯函数。
快速排序只是一个很好的例子。