无状态编程的优点?

2023-11-25

我最近在学习函数式编程(特别是 Haskell,但我也学习了 Lisp 和 Erlang 的教程)。虽然我发现这些概念非常有启发性,但我仍然没有看到“无副作用”概念的实际一面。它有哪些实际优点呢?我试图以函数式思维方式进行思考,但有些情况看起来过于复杂,无法以简单的方式保存状态(我不认为 Haskell 的 monad 是“简单的”)。

是否值得继续深入学习 Haskell(或其他纯函数式语言)?函数式或无状态编程实际上比过程式编程更有效率吗?我以后是否有可能继续使用 Haskell 或其他函数式语言,或者我应该只是为了理解而学习它?

我更关心生产力而不是性能。所以我主要问的是,我使用函数式语言是否会比过程式/面向对象/其他语言更有效率。


Read 简而言之,函数式编程.

无状态编程有很多优点,其中最重要的是戏剧性地多线程和并发代码。坦率地说,可变状态是多线程代码的敌人。如果默认情况下值是不可变的,则程序员无需担心一个线程会改变两个线程之间共享状态的值,因此它消除了与竞争条件相关的一整类多线程错误。由于不存在竞争条件,因此也没有理由使用锁,因此不变性也消除了与死锁相关的另一类错误。

这就是函数式编程如此重要的重要原因,也可能是跳上函数式编程列车的最佳原因。还有很多其他好处,包括简化的调试(即函数是纯粹的,不会改变应用程序其他部分的状态)、更简洁和更具表现力的代码、与严重依赖设计模式的语言相比更少的样板代码,以及编译器可以更积极地优化您的代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无状态编程的优点? 的相关文章

  • 如何在 Haskell 中获得列表的中间位置?

    我刚刚开始使用 Haskel 学习函数式编程 我正在慢慢度过Erik Meijer 在 Channel 9 的讲座 http channel9 msdn com shows Going Deep Lecture Series Erik Me
  • python函数返回函数[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Swit 中的函数式编程将数组元素分配到正确的“桶”

    我是函数式编程的新手 我的问题是我有一个主数组和固定数量的 目标 数组 我想根据每个元素的特定值将主数组中的元素分配到正确的结果数组中 我猜测一种方法是使用一个映射函数来遍历主数组元素 确定正确的 目标数组 值 基于某种逻辑 然后将元素添加
  • Ruby 反向柯里化:这可能吗?

    关于 Ruby 1 9 x 中的柯里化 我一直在某些地方使用它 并且可以像基本上支持 proc 参数的默认参数一样进行翻译 p proc x y z x y z p curry 1 gt returns a lambda p curry 1
  • OCaml 作为 C 库,hello world 示例

    我希望通过 C 调用 OCaml 代码 方法是将 OCaml 编译为包含 C 接口的静态或共享库 这一页 https caml inria fr pub docs manual ocaml intfc html似乎解释了如何为 OCaml
  • 用惯用的 Scala 更新大型数据结构

    我已经尝试 Scala 一段时间了 并且经常遇到支持不可变数据结构的建议 但是当你有一个像这样的数据结构时3D 场景图 大型神经网络或任何具有大量需要频繁更新的对象的东西 对场景中的对象进行动画处理 训练神经网络 这似乎是 运行时效率极低
  • FocusState Textfield 在工具栏 ToolbarItem 中不起作用

    让我解释一下 我有一个带有 SearchBarView 的父视图 我正在传递这样的焦点状态绑定 SearchBarView searchText object searchQuery searching object searching f
  • 如何将数组与 setState 一起使用?

    我目前正在使用以下命令将数组映射到 setState 但没有设置任何内容 也没有记录任何错误 如果我明确地逐行写出它 它就会起作用 关于如何解决这个问题有什么想法或建议吗 使用数组设置状态 不设置状态 const myData messag
  • ViewPager 的 Android Viewholder

    您好 我正在使用 ViewPager 但我现在想保留状态 而不是重新生成单元格 我注意到 viewpager 与 listviews 的自定义适配器非常相似 它们的功能类似 listview 在单元格不再出现在屏幕上后重新生成单元格中的数据
  • 可选择将项目添加到 Scala 映射

    我正在寻找这个问题的惯用解决方案 我正在构建一个valScala 不可变 Map 并希望有选择地添加一项或多项 val aMap Map key1 gt value1 key2 gt value2 if condition key3 gt
  • scala 返回列表中的第一个 Some

    我有一个清单l List T1 目前我正在执行以下操作 myfun T1 gt Option T2 val x Option T2 l map myfun l flatten find gt true The myfun函数返回 None
  • Haskell 对于 Web 应用程序来说足够成熟吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何正确更新反应钩子状态内的数组

    我一直在尝试更新代表反应状态的数组内的对象 当输入的值更改时应该更新该对象 我可以自己找到一种方法来更新它 但我不太确定这是正确的方法 因为当我打开反应开发工具并转到组件选项卡并单击我正在处理的组件时 在输入输入时状态不会立即更新 并且为了
  • duckmap 到底有什么作用?

    From 文档 https docs perl6 org routine duckmap duckmap将会应用 block每个元素上并返回一个新列表 其中包含块的已定义返回值 对于未定义的返回值 duckmap如果该元素实现了 将尝试下降
  • 我为什么要学习 Lisp? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Scala 函数定义参数列表中不同的括号样式

    Scala 中以下两个函数定义有什么区别 1 def sum f Int gt Int a Int b Int Int code 2 def sum f Int gt Int a Int b Int Int code SBT 的控制台 RE
  • F# 静态成员类型约束

    我正在尝试定义一个函数 factorize 它使用类似于 Seq sum 的结构类型约束 需要静态成员 Zero One 和 以便它可以与 int long bigint 等一起使用 似乎无法获得正确的语法 并且无法找到有关该主题的大量资源
  • 对列表中的相邻元素进行分组

    假设我想编写一个函数来执行此操作 输入 1 1 3 3 4 2 2 5 6 6 输出 1 1 3 3 4 2 2 5 6 6 它将相同的相邻元素分组 这个方法的名称应该是什么 此操作有标准名称吗 In 1 1 3 3 4 2 2 5 6 6
  • 相当于 Java 中 C++ 的 std::bind 吗?

    有没有一种方法可以像 C 中的 std bind 一样将 Java 中的参数绑定到函数指针 Java 中类似的东西会是什么 void PrintStringInt const char s int n std cout lt lt s lt
  • 使用默认值压缩而不是删除值?

    我正在 haskell 中寻找一个函数来压缩两个长度可能不同的列表 我能找到的所有 zip 函数都只是删除列表中比其他列表长的所有值 例如 在我的练习中 我有两个示例列表 如果第一个比第二个短 我必须用 0 填充 否则我必须使用 1 我不允

随机推荐

  • 图像(媒体)未显示在 django-heroku 服务器上

    当我上传图像文件成功上传时 我已在 Heroku 服务器上上传了我的网站 Django 应用程序 并且根据设置的图像路径也可以正确获取 但图像未显示 它给出错误媒体文件在服务器中找不到 这是设置媒体设置 MEDIA URL media ME
  • 更改 Mercurial 中的目录结构

    我有一个单人单文件夹 Mercurial 存储库 目录结构很简单 P104 lecture notes files under version control live here 一段时间后 我意识到我想要在存储库中有两个目录 就像这样 P
  • 回调函数中的javascript类变量范围[重复]

    这个问题在这里已经有答案了 可能的重复 在Javascript中 为什么 this 运算符不一致 我有以下课程 function Chat some nick url this socket null this Nickname nick
  • Wamp服务器2.5错误的页面重定向

    我使用 PHP 5 5 安装了 wamp 服务器 2 5 现在 当我尝试从首页 wamp 主页 访问我的项目页面时 它重定向到错误的网址并显示 google 找不到此页面 问题的定义是 我进入 wamp 使用http localhost 那
  • RegEx 使用 RegExp.exec 从字符串中提取所有匹配项

    我正在尝试解析以下类型的字符串 key val key2 val2 其中有任意键 值 对 我想获取键名和值 对于那些好奇的人 我正在尝试解析任务战士的数据库格式 这是我的测试字符串 description aoeu uuid 123sth
  • 上传pdf文件

    我想使用下面给出的代码上传 pdf 文件 它提供浏览功能 但不上传文件 当我单击 sendfile 按钮时 它显示 uploadfile html 代码页 我怎样才能做到这一点 给定代码中的错误在哪里 文件名 upload html
  • HTTP 400:检测到 URL 中存在无效字符。 IIS解码URL太早了?这里发生了什么?

    所以我有这个网址 http test com afolder who else wants to make horror movies 3f 这是 URL 编码版本 http test com afolder who else wants
  • MongoDB:使用 DBcollection find 时对数据进行排序

    我想借助基于 lastUpdated 字段的排序返回查找查询的结果 目前我看到了两种方法 第一种方法 BasicDBObject query new BasicDBObject query put updated at 1 query pu
  • 是否可以在 301、302、303 或 307 重定向上修改或添加自定义 http 标头?

    HTTP 协议是否允许修改 302 请求标头 以便可以设置一些参数并将其传递给接收请求的 url 302 是响应代码 而不是请求标头 客户端将通过对新 URL 执行新请求来解析重定向 因此您的客户端可以向该新请求添加它想要的任何标头 希望将
  • 使用图像渲染 CSS3 内嵌阴影

    我想在我正在开发的网站上利用新的 CSS3 box shadow 功能 问题是 如果内部有 img 边框隐藏在图像区域周围 Chrome 9 0 5 和 Opera 10 无法正确渲染插入边框 我知道 box shadow 仍在进行中 但我
  • 添加分页 MVC 和 Azure 表存储

    我正在尝试将分页应用于我的 MVC 应用程序 我正在使用 Azure 表存储 这是我尝试过的 public List
  • VS2019:如何解决资源视图中的“未知子语言:0x8”消息?

    我最近开始在我的 C 11 项目中使用 Visual Studio 2019 VS2019 转换了该项目并将其编译为可执行文件 但我无法在资源查看器中打开我的资源 rc 文件 它给了我这个警告 此文件中的资源使用未知语言 中性 默认 未知子
  • 获取 UIPageViewController 当前索引的可靠方法

    我正在寻找一个reliable跟踪 UIPageViewController 当前索引的方法 这个问题是众所周知的 尽管 viewController 已正确呈现 但很难跟踪当前索引 我认为在 SO 社区中刷新这个主题会很好 因为由于某种原
  • 安装的模块为空

    我正在尝试使用setuptools对于 python3 代码 我的项目结构 testSetup testSetup testSetup testSetup testSetup foo py testSetup Setup py testSe
  • Pandas:基于另一列的一列的箱线图

    假设我有一个如下所示的数据框 my dataframe Age Group 0 31 A 1 24 A 2 25 A 3 36 A 4 50 NaN 5 27 A 6 49 A 7 24 A 8 63 A 9 25 A 10 65 A 11
  • Ruby 1.9.1 中的本机线程,对我来说有什么用处?

    所以 Ruby 现在是 1 9 1宣布稳定 Rails 应该可以与它一起工作 并且宝石正在慢慢地移植到它 它具有本机线程和全局解释器锁 GIL 由于 GIL 已到位 本机线程是否比 1 9 1 中的绿色线程提供任何优势 1 9 中的线程是本
  • Window.open 位置 =no 不起作用

    我需要在我的网络应用程序中创建一个弹出窗口来加载统一文件 为此 我使用 Javascript 的 Window Open 我不希望用户看到弹出窗口的 URL 或让他有机会更改 URL 根据这个链接 http javascript about
  • 我可以实现一系列可重用的测试来测试接口的实现吗?

    我正在用 C 编写一系列集合类 每个集合类都实现类似的自定义接口 是否可以为接口编写单个单元测试集合 并在多个不同的实现上自动运行它们 我想避免每个实现的任何重复的测试代码 我愿意研究任何框架 NUnit 等 或 Visual Studio
  • 在操作员期望的地方找到了裸字

    我是 Perl 新手 我正在摆弄 我在网上找到了这段代码 这是代码片段 82 process input q 83 process input n Task toptask Task set new threshold 84 process
  • 无状态编程的优点?

    我最近在学习函数式编程 特别是 Haskell 但我也学习了 Lisp 和 Erlang 的教程 虽然我发现这些概念非常有启发性 但我仍然没有看到 无副作用 概念的实际一面 它有哪些实际优点呢 我试图以函数式思维方式进行思考 但有些情况看起