- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
作为函数式编程的新手,我花了很多精力想知道“这是做事的函数式方式吗?”显然,递归与迭代非常简单,递归显然是函数式的处理方式。但以闭包为例。我已经使用 Lisp 学习了闭包,我知道闭包是函数和环境(听起来很像状态和行为)的组合。例如:
(let ((x 1))
(defun doubleX()
(setf x (* x 2))))
这里我们有一个在 x 变量的环境中定义的函数 doubleX。我们可以将这个函数传递给其他函数,然后调用它,它仍然可以引用 x 变量。该函数可以继续引用该变量,即使它是在定义该变量的环境之外调用的。我见过的很多关于闭包的例子都是这样的。其中setf用于改变词法变量的值。这让我感到困惑,因为:
1.) 我认为 setf 是邪恶的。主要是因为它会引起副作用,而且显然它们也是邪恶的。
2.) 这真的是“功能性”的吗?似乎只是一种保持全局状态的方式,我认为函数式语言是无状态的。
也许我只是不理解闭包。有人可以帮帮我吗?
最佳答案
你是对的,使用闭包来操作状态并不是纯粹的函数式的。 Lisp 允许您以函数式风格编程,但它并不强制您这样做。我实际上更喜欢这种方法,因为它允许我在纯功能性和修改状态的便利性之间取得务实的平衡。
您可能会尝试编写一些从外部看起来功能强大但为了提高效率而保持内部可变状态的东西。一个很好的例子是内存,你可以记录所有以前的调用来加速像斐波那契这样的函数,但是由于函数总是为相同的输入返回相同的输出并且不修改任何外部状态,它可以被考虑从外部发挥作用。
关于programming-languages - 闭包中的副作用,它们仍然是纯功能性的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/293567/
这纯粹是一个练习,但给出以下代码: var someCondition = (....); var res = []; if (someCondition) { res.push("A"); }
Closed. This question is opinion-based。它当前不接受答案。 想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。 6年前关闭。
Heinrich Apfelmus慷慨地插话this问题。我曾考虑过使用 accumB作为解决方案,但认为会出现类型错误。无论如何,在尝试了他的建议之后,我确实收到了类型错误。 let bGameSt
我需要访问 React 组件中的 window 对象以从查询字符串中获取某些内容。这就是我的组件的样子: export function MyComponent() { return (
我如何声明接受数字和数字列表的函数,如果列表中没有这样的数字则返回 NONE,否则返回列表选项(Haskell 中的“Maybe”)没有这个数字?如果有多个这样的数字,函数必须只删除其中的第一个。 a
类型的值如何: type Tree = | Node of int * Tree list 有一个以函数方式生成的引用自身的值? 对于合适的 Tree 定义,结果值应等于以下 Python 代
我一直在脚本(数据科学工作)中使用 F# 并开发与 C# 一起使用的类库。在后一种情况下,我一直在使用纯功能代码创建模块。 如果我想开始完全在 F# 中开发大型应用程序,我不确定我会如何构建它。我发现
对于用函数式语言创建 GUI 的方法已经有很多研究。有用于推/拉 FRP、基于箭头的 FRP 以及可能还有其他高级研究的库。 Many people似乎同意这是更原生的方式,但几乎每个人似乎都在使用命
我现在正在 Traveler 中尝试处理独立于玩家的游戏状态更新。作为引用,该项目是 here (开发分支是与此问题相关的分支)。 Libraries/Universe/GameState.hs 有一
这里有 2 个对象: object1: { email: somevalue url: somevalue description: somevalue } object2:
我正在使用 Keras 函数式 API 创建一个神经网络,它将词嵌入层作为句子分类任务的输入。但是我的代码在连接输入层和嵌入层的开始就中断了。按照 https://medium.com/tensorf
为什么不能编译? #include #include class A { A() { typedef boost::function FunctionCall;
我很清楚为什么我们需要函数式 setState 以及它是如何工作的,例如 this.setState((prevState, props) => ...); 您可以像上面那样获取先前的状态作为参数。
我最近一直在研究使用 Javascript 进行的函数式编程,对此我是个菜鸟。 在编写一些“map”、“reduce”和“find”函数时,我发现从 JS 1.5 版开始,这些函数已经可用(参见 ht
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
我正在寻找一种用于 HTML 表管理的一体化解决方案。我想要完成的是为用户提供简单的表管理,该管理将提供按列排序、过滤数据(每列或每表全局)、移动列(更改其顺序)和切换列可见性。 基本上是 ExtJS
我不明白其中的错误。我正在尝试使用 std::function 将成员函数作为参数传递。除了第 4 种也是最后一种情况外,它工作正常。 void window::newGame() { } //sho
我是 Scala 和函数式编程的初学者,我有一些算法代码可能有一些味道,因为它使用了可变性,但也有一个错误,部分原因是它是可变的。我有两组二维点。第 1 组中的每个点都与第 2 组中最近的点相关联(给
我正在尝试使用 Keras 实现带有负采样的 Word2Vec CBOW,遵循发现的代码 here : EMBEDDING_DIM = 100 sentences = SentencesIterato
我绝对为此失去了理智。我不明白为什么会这样。每次我运行此测试时,该对象都会保存到正常的非测试数据库中。然而,测试结束时的两个断言无论如何都失败了,说他们无法在数据库中找到任何用户,即使每次测试运行时我
我是一名优秀的程序员,十分优秀!