【问题标题】:Pure Functional Programming: How write a code where 3 functions can affect the same state纯函数式编程:如何编写 3 个函数可以影响相同状态的代码
【发布时间】:2014-09-13 20:13:59
【问题描述】:

我正在阅读“Learn You a Haskell for Great Good!”,这本书非常好,我知道如何在函数内部使用递归来处理状态,或者在许多情况下,简单的折叠可以替代经验语言中需要的代码变异,没关系

我读过关于 state monad 的文章,它很好,但我觉得这只是一个把戏。这句话简明扼要地描述了什么是状态单子

State monad 实际上是对传递概念的抽象 在你的函数的一个额外参数中声明 - 它仍然是 纯粹的,它只是给你很多语法帮助

how to simulate haskell state?

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

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

但是,如果我每次通话都需要它怎么办?这些元组将被附加到一个列表中?

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

Managing state - chapter 3 of SICP

是否有可能是不可变且纯粹的替代方案?我很确定使用函数式反应式编程是可能的,但我想知道“经典的纯函数式解决方案”。

【问题讨论】:

  • 我不清楚你在问什么。如果每个函数都返回这三个值之一,那么状态是什么?
  • 为什么不呢,只需返回一个带有附加数据的新列表。
  • 嗨 Cirde,如果我的问题不清楚,对不起:我需要将所有这些函数添加到同一个列表中 l ...状态将在单个列表中

标签: haskell functional-programming


【解决方案1】:

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

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

然后在状态列表中添加Items 非常简单:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 2022-08-21
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 2015-11-30
    相关资源
    最近更新 更多