微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 STArray 并忽略 Purescript

如何解决使用 STArray 并忽略 Purescript

我想我已经接近我想要的了,尽管我怀疑我不了解 thaw / TH Region 的工作原理。

这是我想要实现的(至少大致上)

modifyPerIndex :: forall t a. Foldable t => t (Tuple Int (a -> a)) -> Array a -> Array a
modifyPerIndex foldableActions array = run do
  mutableArray <- thaw array
  let actions = fromFoldable foldableActions
  foreach actions (\(Tuple index action) -> modify index action mutableArray)
  freeze mutableArray

这就是我想象的 updateAtIndices 工作方式。我想我可以通过读取值、应用 modifyPerIndex 并将结果映射到要发送到 updateAtIndices 的元组列表来编写 updateAtIndices 来使用 (a -> a)

我很好奇如何做到这一点。

在上面的代码中,modify 返回 ST h Boolean,我想将其更改为 ST h Unit。那就是我迷路的地方。我知道这里的 h 是对可变数据施加的约束,以阻止它离开 run,我不明白如何使用它。

解决方法

有几个选项。但这与h无关。您不必“使用”它做任何事情,也完全不必担心。

首先,最愚蠢和直接的方法 - 只需将结果绑定到一个被忽略的变量,然后单独返回 unit

foreach actions \(Tuple index action) -> do
  _ <- modify index action mutableArray
  pure unit

或者,您可以使用 void,它在幕后或多或少地做同样的事情:

foreach actions \(Tuple index action) -> void $ modify index action mutableArray

但我会直接使用 for_,它与 foreach 相同,但适用于任何 monad(不仅仅是 ST)并且忽略单个迭代的返回值:>

for_ actions \(Tuple index action) -> modify index action mutableArray

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。