5

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

假设我们有一个对象

a = {x:1,y:2}

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

4

1 回答 1

7

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

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

如果没有,您应该能够轻松地定义一个函数来使用STFFI 更新记录。棘手的一点是选择正确的类型。如果您想为特定键做某事,您可以编写一个函数

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

例如。在不失去类型安全的情况下定义一个通用的 setter 会更加困难。这是权衡Data.StrMap:您将自己限制为单一值类型,但可以使用任意键。

于 2015-09-23T19:31:51.767 回答