纯函数式编程:如何编写代码,其中3个函数可以影响相同的状态

时间:2014-09-13 04:14:26

标签: haskell functional-programming

我正在读“为了好大学而学习你的Haskell!”,非常好的书,我知道如何在函数内部使用递归来处理状态,或者在很多情况下,简单的折叠可以替代经验语言需要的代码突变,没关系

我读过有关州monad的信息,这很好但我觉得这只是一个伎俩。这句话简明扼要地描述了状态monad

  

状态monad实际上是对传球理念的抽象   在你的函数的额外参数周围陈述 - 它仍然存在   纯粹,它只是给你很多语法帮助

how to simulate haskell state?

现在我正在考虑一个假设的代码:

我有3个函数,第一个“user”返回一个元组,其中包含用户名和他的年龄(“tom”,20)。第二个也返回一个元组,其中包含公司名称及其成立年份(“google”,1998),第三个可能是非盈利组织(“mozilla”,2003),非常简单。

但是,如果我在每次通话时都需要,会发生什么?这些元组将被附加到一个列表中吗?

检查此响应似乎我可以(可以?)使用可变状态

Managing state - chapter 3 of SICP

是否有可能成为不可改变的纯粹替代品?我很确定使用功能性反应式编程是可能的,但我希望知道“经典的纯功能解决方案”。

1 个答案:

答案 0 :(得分:4)

假设您想区分这三种类型的元组

data Item = User      String Int
          | Company   String Int
          | NonProfit String Int

然后将Item添加到状态列表非常简单:

addUser, addCompany, addNonProfit :: String -> Int -> State [Item] ()
addUser      name age     = modify (\st -> User      name age     : st)
addCompany   name founded = modify (\st -> Company   name founded : st)
addNonProfit name founded = modify (\st -> NonProfit name founded : st)