Functional programming 如何存储网络变量以便在函数式编程语言中重复使用?

Functional programming 如何存储网络变量以便在函数式编程语言中重复使用?,functional-programming,Functional Programming,如何在运行时管理使用fp语言从网络检索的可重用状态 我知道Clojure中的原子,但对其他语言一无所知。是否有一种方法可以使用纯fp原则管理州内的网络数据?如果没有可变状态,服务将不得不在每次需要函数的一段数据时发出网络请求[函数需要该数据作为输入]。这似乎很贵 我知道Clojure中的原子,但对其他语言一无所知 所有FP语言都很可能有一个类似于Clojure的atom的构造,例如Haskell有TVar、MVar、TMVar,它们是Clojure中类似的托管安全可变容器,如atom和Ref。这

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

我知道Clojure中的原子,但对其他语言一无所知。是否有一种方法可以使用纯fp原则管理州内的网络数据?如果没有可变状态,服务将不得不在每次需要函数的一段数据时发出网络请求[函数需要该数据作为输入]。这似乎很贵

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

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

现在可能你想听到的是,当你试图保持事物纯粹的功能性时,我觉得你的问题是。。。但是这些可变状态容器不是不起作用的吗

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

以下是要点:

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不会是纯的,这是正常的,在边界上,当它与用户或外部世界交互时,某些东西必须是不纯净的

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

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

现在可能你想听到的是,当你试图保持事物纯粹的功能性时,我觉得你的问题是。。。但是这些可变状态容器不是不起作用的吗

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

以下是要点:

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不会是纯粹的,这是正常的,在边界上,当它与用户或外部世界交互时,某些东西必须是不纯净的。

每种函数式编程语言都有某种“逃逸图案”来产生效果,否则它将是徒劳的。如果可以执行网络请求,也可以将值存储在某个有状态变量中。可以将名称绑定到值,这样就可以存储,但不会重新分配或变异。调用函数并将新名称绑定作为参数传递,而不是重新分配。复制复合值而不是进行变异。为了使后者有效,复合值被编码为平衡树。然后,您只能将路径复制到修改后的组件并共享其余的。@scriptum这是有道理的,但是如果一台服务器(S1)需要等待用户操作登录到另一台服务器(S2),情况又如何呢。当S1被告知登录S2时,它如何在运行时将值绑定到名称?@ohryan假设我们的语言异步处理DB请求。我们需要一个类型,该类型接受异步生成的值并从此包含该值,即它不能提供获取该值的方法。因此,我们不是将其传递给函数,而是通过将其他函数提升到值的有效上下文中,以另一种方式进行传递。只有我们这类人需要知道这是如何运作的。它编码了构图如何为这种特殊效果工作。通过这种方式,程序的其余部分保持纯净。我所说的类型是一个函子,applicative或monad,这取决于您需要多少表达能力。这是一个简单的解释,应该给出一个粗略的直觉。每种函数式编程语言都有某种“逃生舱”来产生效果,否则它将是徒劳的。如果可以执行网络请求,也可以将值存储在某个有状态变量中。可以将名称绑定到值,这样就可以存储,但不会重新分配或变异。调用函数并将新名称绑定作为参数传递,而不是重新分配。复制复合值而不是进行变异。为了使后者有效,复合值被编码为平衡树。然后,您只能将路径复制到修改后的组件并共享其余的。@scriptum这是有道理的,但是如果一台服务器(S1)需要等待用户操作登录到另一台服务器(S2),情况又如何呢。当S1被告知登录S2时,它如何在运行时将值绑定到名称?@ohryan假设我们的语言异步处理DB请求。我们需要一个类型,该类型接受异步生成的值并从此包含该值,即它不能提供获取该值的方法。因此,我们不是将其传递给函数,而是以另一种方式进行传递