functional-programming - 您如何存储网络变量以便在函数式编程语言中重复使用?
问题描述
您如何在运行时管理从网络中以 fp 语言检索的可重用状态?
我知道 Clojure 中的原子,但对其他语言一无所知。有没有办法使用纯 fp 原则来管理状态内的网络数据?如果没有可变状态,则服务必须在每次需要为功能提供一段数据时发出网络请求[需要该数据作为输入]。这似乎非常昂贵。
解决方案
我知道 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 不会是纯的,这很正常,在边界处某些东西在与用户或外部世界交互时必须是不纯的。
推荐阅读
- angular - Formcontrol 禁用输入值预览
- c++ - VScode 给出错误消息“未捕获的语法错误:无效或意外令牌”
- c# - SAML 签名标签名称标准
- csv - 如果仅当相关性给出 not_found 值时(如果我们没有看到任何值),如何在下一个请求中传递 csv 文件
- django - 在 HTML 文件更改/条件 Django 调试模式下在 Docker 中重新加载 Gunicorn
- typescript - 将 testcafe 套件迁移到 TypeScript
- reactjs - Meteorjs 与 ChakraUI + React 路由器的集成
- templates - Jira 模板替代品现已投入使用
- java - ElasticSearch 客户端:如何获取时间点?
- sql - 如何从sql中的字符串中删除双字节空间