Purescript中的变异状态

时间:2015-09-23 16:20:47

标签: purescript

我刚开始学习Purescript所以我希望这不是一个愚蠢的问题。

假设我们有一个对象

a = {x:1,y:2}

我们想要将x更改为等于2.据我所知,如果我们使用ST monad,我们将不得不复制整个对象以更改值。如果初始对象很大,这将是非常低效的。改变对象的正确方法是什么?

1 个答案:

答案 0 :(得分:6)

ST monad是一种很好的方法,但根据您的使用情况,可能有也可能没有标准库函数。

Data.StrMap中的purescript-maps模块为带有字符串键的同类记录定义外来类型,因此如果您的值都具有相同的类型,则可以使用Data.StrMap.ST来改变您的记录的地方。

如果没有,您应该可以轻松地使用ST和FFI定义一个更新记录的功能。棘手的一点是选择正确的类型。如果您想为特定键执行某些操作,可以编写函数

setFoo :: forall r a h eff. STRef h { foo :: a | r } -> a -> Eff (st :: ST h | eff) Unit
例如,

。在不损失类型安全性的情况下定义通用setter会更加困难。这是Data.StrMap所做的权衡:你将自己局限于单一的值类型,但可以使用任意键。