首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在函数式编程中避免副作用

如何在函数式编程中避免副作用
EN

Stack Overflow用户
提问于 2013-10-14 06:17:58
回答 1查看 1.8K关注 0票数 1

我一直在比较Scala与Java在并发编程方面的优势。

显然,我提到的第一点是Scala是一种函数式编程语言(部分地)使用FP避免了的副作用。

与命令式语言相比,如何在函数式编程中避免副作用,以及如何在多线程/并发编程中工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-14 06:37:41

这句话的意思是,我认为Scala作为一个函数式-OO混合 language 鼓励(有时还允许)使用函数结构和规则,这将使不会产生任何副作用。您可以很好地编写具有副作用的非功能有状态Scala代码;-)另一方面,您可以尝试编写函数式Java (例如),但是由于函数不是第一类对象,所以它可能看起来很难看。所以我不会说它是自然的,但更像是在某种程度上帮助你,而且总体上鼓励你这样做。

在进行函数式编程时,您应该坚持几个原则,这样就不会产生任何副作用:

  • 不变的是一种很好的结构,一旦创建就不能修改。例如,在Java列表中,您可以修改第n个元素,但是在Scala中,您可以使用新元素返回该列表的副本。是的,这可能意味着程序中有更多的对象,但也会导致更多的可重用和更安全的代码。
  • 将值作为参数传递,不将状态存储在成员变量中--共享状态是导致许多问题的原因之一,管理共享状态是有问题的(例如,您需要使用锁等)。
  • 如果价格便宜的话,更喜欢重新计算值,而不是缓存它们(这有一些规则的例外,例如http://en.wikipedia.org/wiki/Memoization是一种非常常用的技术!)

实际上,通过遵循上述规则避免副作用的最大好处之一是更容易并发编程!毕竟,管理共享状态是并发编程的最大障碍!

因为其中一条规则是可变的和共享的状态是不好的,所以不要使用它!相反,许多函数式语言(如Erlang或Scala)更喜欢所谓的Actor模型,其中Actors (您可以将其与线程进行比较)仅通过相互发送消息来进行通信(参见?传递值,而不是存储在某个地方!)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19354450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档