我正在读“为了好大学而学习你的Haskell!”,非常好的书,我知道如何在函数内部使用递归来处理状态,或者在很多情况下,简单的折叠可以替代经验语言需要的代码突变,没关系
我读过有关州monad的信息,这很好但我觉得这只是一个伎俩。这句话简明扼要地描述了状态monad
状态monad实际上是对传球理念的抽象 在你的函数的额外参数周围陈述 - 它仍然存在 纯粹,它只是给你很多语法帮助
how to simulate haskell state?
现在我正在考虑一个假设的代码:
我有3个函数,第一个“user”返回一个元组,其中包含用户名和他的年龄(“tom”,20)。第二个也返回一个元组,其中包含公司名称及其成立年份(“google”,1998),第三个可能是非盈利组织(“mozilla”,2003),非常简单。
但是,如果我在每次通话时都需要,会发生什么?这些元组将被附加到一个列表中吗?
检查此响应似乎我可以(可以?)使用可变状态
Managing state - chapter 3 of SICP
是否有可能成为不可改变的纯粹替代品?我很确定使用功能性反应式编程是可能的,但我希望知道“经典的纯功能解决方案”。
答案 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)