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

Haskell 纯函数编程:如何编写3个函数可以影响相同状态的代码,haskell,functional-programming,Haskell,Functional Programming,我在读《从哈斯克尔身上学到好东西!》,这是一本很好的书,我知道如何在函数中使用递归来处理状态,或者在很多情况下,一个简单的折叠可以替代在经验语言中需要变异的代码,这是可以的 我读过关于国家单子的书,这很好,但我觉得这只是一个把戏。这个短语简洁地描述了什么是状态单子 状态单子实际上是对传递概念的抽象 在函数中添加一个额外的参数,它仍然是 纯粹的,它只是给了你很多语法上的帮助 现在我在用一个算术代码思考: 我有3个函数,第一个“user”返回一个带有用户名和年龄的元组(“tom”,20)。第二个还

我在读《从哈斯克尔身上学到好东西!》,这是一本很好的书,我知道如何在函数中使用递归来处理状态,或者在很多情况下,一个简单的折叠可以替代在经验语言中需要变异的代码,这是可以的

我读过关于国家单子的书,这很好,但我觉得这只是一个把戏。这个短语简洁地描述了什么是状态单子

状态单子实际上是对传递概念的抽象 在函数中添加一个额外的参数,它仍然是 纯粹的,它只是给了你很多语法上的帮助

现在我在用一个算术代码思考:

我有3个函数,第一个“user”返回一个带有用户名和年龄的元组(“tom”,20)。第二个还返回一个带有公司名称和基金年的元组(“谷歌”,1998),第三个可以是非营利组织(Mozilla),2003),非常简单。 但是如果我每次打电话都需要这个怎么办?这些元组将附加到一个列表中

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


它是否可能是一个不变的、纯粹的选择?我很确定使用函数式反应式编程是可能的,但我想知道“经典的纯函数式解决方案”。

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

data Item = User      String Int
          | Company   String Int
          | NonProfit String Int
然后在状态中将
项添加到列表中非常简单:

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)

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

data Item = User      String Int
          | Company   String Int
          | NonProfit String Int
然后在状态中将
项添加到列表中非常简单:

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)

我不清楚你在问什么。如果每个函数都返回这三个值中的一个,那么状态是什么?为什么不呢,只需返回一个带有附加数据的新列表。Hi Cirde,如果我的问题不清楚,很抱歉:我需要所有这些函数向同一个列表添加一个元组l…状态将在单个列表中。我不清楚你在问什么。如果每个函数都返回这三个值中的一个,那么状态是什么?为什么不呢,只需返回一个带有附加数据的新列表。Hi Cirde,如果我的问题不清楚,很抱歉:我需要所有这些函数向同一列表添加一个元组l…状态将在单个列表中