首页 > 解决方案 > 您如何存储网络变量以便在函数式编程语言中重复使用?

问题描述

您如何在运行时管理从网络中以 fp 语言检索的可重用状态?

我知道 Clojure 中的原子,但对其他语言一无所知。有没有办法使用纯 fp 原则来管理状态内的网络数据?如果没有可变状态,则服务必须在每次需要为功能提供一段数据时发出网络请求[需要该数据作为输入]。这似乎非常昂贵。

标签: functional-programming

解决方案


我知道 Clojure 中的原子,但对其他语言一无所知

所有 FP 语言很可能都有一个类似于 Clojure 的 atom 的构造,例如 Haskell 有 TVar、MVar、TMVar,它们是 Clojure 中类似的托管安全可变容器,如 Atom 和 Ref。这是因为状态通常是不可避免的,并且内存不是无限的,所以在某些时候你需要突变,但 FP 语言所做的是隔离该突变并对其进行管理,从而限制它对程序复杂性和安全性的影响。

现在,您可能想听到什么,因为您正试图让事情保持纯粹的功能,我觉得您的问题是......但是这些可变状态容器不是没有功能吗?

答案是保持纯 FP 风格,您需要将事物建模为数据流并传递状态。您保持状态是因为它不断地传递给下一个正在运行或等待的事物。有时这比好的要好,而且许多 FP 语言的框架不会这样做,它们将使用像原子这样的托管可变容器。

所以这里是要点:

waitForNextCommand(state[])
-- command, state -->
if state missing token
  -- state[] -->
  getTokenFromA
  -- state[token] -->
  callB
  -- state[token] -->
  waitForNextCommand(state[token]) ;; recursive
else if state has token
  -- state[token] -->
  callB
  -- state[token] -->
  waitForNextCommand(state[token]) ;; recursive

现在没有全局状态,也没有可变容器,只有不可变输入到输出的函数在递归的数据流中相互调用,但如果你已经有一个令牌,你就不会调用 getTokenFromA。

也就是说,waitForNextCommand 不会是纯的,这很正常,在边界处某些东西在与用户或外部世界交互时必须是不纯的。


推荐阅读