函数式编程中不可变数据的问题

Nar*_*sty 6 erlang multithreading haskell functional-programming clojure

我是函数式编程的新手.我所理解的是函数式编程是使用纯函数编写代码而不改变数据的价值.

我们不需要改变变量的值,而是在需要更新变量时在函数式编程中创建新的变量.

假设我们有一个变量x,它表示程序发出的HTTP请求总数.如果我们有两个线程,那么我希望线程在x任何线程发出HTTP请求时递增.如果两个线程都创建了变量的不同副本,x那么它们如何同步其值x.例如:如果线程1发出10个HTTP请求而线程2发出11个HTTP请求,那么它们将分别打印10和11但是我将如何打印21.

lee*_*eor 8

我可以为clojure案件提供答案.在clojure,如果您需要协调对共享状态的访问,那么语言中的构造将用于处理这些情况.

在这种情况下,您可以使用a atom来保存该值.对a的更改atom是原子的,并且将通过clojure的STM乐观地进行.原子是clojure的参考类型之一.原子本质上是对一个值的引用,它可以通过原子的变异函数以受控的方式随时间变化.

有关原子和其他引用类型的更多信息,请参阅clojure 文档.


Sib*_*ibi 1

我将讨论 Haskell 部分。MVar是线程的通信机制之一。这是西蒙·马洛(Simon Marlow)书中的示例之一(该程序是不言自明的):

main = do
  m <- newEmptyMVar
  forkIO $ do putMVar m 'x'; putMVar m 'y'
  r <- takeMVar m
  print r
  r <- takeMVar m
  print r
Run Code Online (Sandbox Code Playgroud)

上述程序的输出将是:

'x'
'y'
Run Code Online (Sandbox Code Playgroud)

您可以在上面的示例中看到MVar变量中的值m是如何在线程之间共享的。您可以在本书中了解有关这些技术的更多信息。