在函数式编程中改变状态

时间:2017-09-12 13:41:02

标签: scala functional-programming

我想编写一段代码(在函数式编程风格中),它应该跟踪用户是否登录。我想我必须以不可改变的方式做事。

以下伪代码似乎功能正常。它需要一个状态并返回其反向值。它没有副作用

changeState(Boolean state){
 return !state
}

在我的逻辑中,一旦用户登录(或注销),我将调用上面的函数,将其传递给登录状态的当前值。我无法想到如何以Function方式存储登录状态。这是错误的,因为currentLoggedState是val

    val currentLoggedState = false;

    //user entered login details correctly, change state

  currentLoggedState = changeState(currentLoggedState)

我如何以功能方式编写这样的逻辑?

1 个答案:

答案 0 :(得分:2)

国家无法避免。函数式编程的目的是为了实现更好的推理,而不是从程序中创建纯粹的数学模型。

例如,数据库实际上是一个巨型状态存储。当你正在创建,更新,删除等时,你正在操纵一些状态。

还有环境(例如akka演员模型),其中状态也是不可避免的。尝试与演员实现一个非平凡的系统,我保证你的演员充满了列表和哈希图。在某些时候它变得不可避免。例如,即使是在EPFL的礼貌下举办的Coursera课程,称为“反应性编程”(它已被更名为Scala中的FP Design或类似的东西),有一个由Roland Kuhn亲自担任的部分,它涉及与演员和整个课程作业有一大堆的状态。我这样说是为了让你知道Scala社区中有权威的人说有时候状态是无法避免的。

在您的情况下,最好将其推送到Redis或类似的存储,以便代码本身不存在状态(只有可变性是持久层/存储)。