Purescript中的变异状态

Tza*_*tev 4 purescript

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

假设我们有一个对象

a = {x:1,y:2}
Run Code Online (Sandbox Code Playgroud)

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

Phi*_*man 6

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
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为多态标签已经足够了,它们已经成为未来编译器版本的焦点,而不是一个明确的提议. (2认同)