问题标签 [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.
garbage-collection - 不传递内存的纯函数和非抛出函数是否会自动收集垃圾?
假设您在 D 中有一个函数,pure
并且nothrow
它的返回类型和参数类型不能传递任何新分配的内存。那么我可以将@nogc
属性添加到这个函数吗?如果没有,将来是否有可能实现这一点?
我的观点如下:由于该函数没有任何可见的副作用,因此在途中分配的所有内存都可以在函数退出时确定性地释放。因此,实际上并不需要 GC,因为可以避免标记和扫描步骤。还是不能?
function - 函数式编程中的所有纯函数都是连续的吗?
我知道 Haskell 函数集只是所有数学函数的一个子集,因为它是一种编程语言,所以它的所有函数都必须是可计算的。但是,从数学的角度来看,所有 Haskell 函数(以及一般的纯函数)都是连续的吗?
functional-programming - “纯OCaml”是否等同于文献和习惯中的“纯功能”?
我的理解是,“纯 OCaml”是指 OCaml 中标准的所有内容,包括其非“纯”功能特性,而“纯功能”是指通常的属性:没有副作用、没有异常处理等。从这个意义上说,“纯 OCaml” 实现与使用 C 或 C++ 实现的 OCaml 相对。
然而,我最近与一个非常坚持“纯 OCaml”在某些圈子中意味着 OCaml 的“纯功能子集”的人就这个问题进行了辩论。
这两个含义真的在社区中使用吗?是否存在这样的歧义?是否有一些备受推崇的来源在第二种意义上使用“Pure OCaml”的指针?
functional-programming - 具有非纯参数类型函数的函数可以是纯的吗?
如果函数不直接更改/存储状态、不引用全局变量等,那么将非纯函数作为参数的函数是否可以被视为纯函数?我们在哪里以及如何在什么是纯的和什么不是纯的之间划清界限,是仅仅在函数的问题代码上还是我们考虑到调用参数的影响?
例如,想象一下这种情况,其中纯函数表示无状态工作流,并将在此工作流期间要执行的一些操作作为参数。其中一项操作会在某处更改某些状态。因此,如果我严格查看我的工作流程的实现,它看起来很纯粹,但最终它确实通过调用这个修改状态的参数函数来修改状态。我很想推测工作流也不是纯的,但是传入一个不改变状态的不同参数会使它变得纯,所以我很困惑。
任何帮助都感激不尽。谢谢你。
scala - 遍历元组结构中的叶子
假设我有一个fn
接受以下形式的元组的函数:
我不知道如何实现fn
能够遍历每个叶子(分别是“b”、“c”、“e”、“f”,最后是“h”),每次知道叶子自己的父母。
Shapeless 似乎是一个解决方案,即使我不知道如何实现它。
注意:首选香草 scala 方法(如果可能的话)。注意:我知道我有一个Tuple2(String, T)
,其中 T 可以是另一个 Tuple(String, T)、一个字符串、一个数字、一个布尔值或一个 Seq[V]。注意: Seq[V] 其中 V 可以是字符串、数字或布尔值。
haskell - Haskell 的纯度是由类型系统还是 IO 的实现来强制执行的?
人们总是说 Haskell 的类型系统可以防止不纯代码污染纯代码,因为您总是必须IO
在类型签名中指定。但是,这是类型系统本身的结果,还是真的只是IO(..)
没有导出?
基本上,如果类型构造函数可用,这样的事情是否可以完成?
clojure - 使用 clojure 进行函数式编程,避免可变状态
所以,我的问题是我是否可以在我的程序需要执行的特定操作中避免可变状态。
一些背景:大约一周前,我决定学习使用 Clojure 编程,自学函数式编程。(白天我是一名主要使用 C# 的 Web 开发人员。
因此,根据我的经验,学习一门语言的最佳方式是从一个项目开始。无论如何,我选择创建我需要的东西,一个小工具,用于从 XML 文件中读取文本片段,然后在其他文本文件中进行一些查找和替换(并检测不一致。
所以我已经完成了将文件解析为我需要的地图列表的部分,这就是问题所在:按照我的看法,我可以在函数之间尽可能多地传递我的数据,在在某些时候,我的程序没有什么可做的。然后当用户单击 (javax.swing-button) 时,我的程序将忘记所有内容。
函数式程序员将如何解决这个问题?
我想出的可能的解决方案:
-单子。(非常适合构建复杂性,但在功能停止执行时仍然会消失。
- 每次用户单击按钮时再次从磁盘读取文件:看起来很傻。
- 将我的文件内容存储在我的表单控件中。似乎是在作弊(而且也是错误的。
- 解析文件时,创建一个包含对结果数据结构的引用的闭包,并将其安装到新的事件处理程序中:看起来像是作弊,通常只是一个奇怪(但有趣)的尝试。
谁能告诉我我是否正确地将其识别为没有 ^dynamic var 就无法做到的情况?
任何指针将不胜感激。)))))
编辑:我不是要代码示例,只是一个是或否的答案,也许是关于下一步要查找什么的提示,问题是:有没有办法让 clojure 程序记住它计算的一些数据,处于空闲状态(直到下一个 java 事件处理程序被触发),而不使用全局变量、原子、引用或代理?
我问的原因是我想以正确的方式学习以功能样式进行编程,并且我基本上是在检查我是否不会偏离轨道。
感谢迄今为止所有有用的回复,肯定有阅读书籍的提示,这总是很好。
awk - 运行 awk 确定性
我正在寻找一种以可验证的确定性方式运行 awk 的方法,也就是说:结果应仅由输入确定。换句话说,假设一个程序有输出,我想知道它是可重复的。
这意味着删除对非确定性输入源的访问,例如系统时间或内容不断变化的文件,例如/dev/random
.
我查看了 gawk 中的沙盒标志,我认为这不会有帮助,还有ZeroVM。