ReasonML,如果选项为 Some(x),则会对 x 产生副作用调用

ReasonML, side effecting call on x if option is Some(x)

我有let intervalId = option(Js.Global.intervalId)

如果选项有一个值(即 Some(id) 而不是 None)[=17=,我想要一个简洁的方法来调用 Js.Global.clearInterval ]

也许 Belt.Option.map 函数就是答案,但我在使用它时遇到问题。

我对 OCaml 和 ReasonML 很陌生,但我知道的几种语言都有合适的功能。我在这里解释其中的一些内容,以说明我在寻找什么:

在 Scala 中我会说:intervalId.foreach(Js.Global.clearInterval)

在Swift中我会说:intervalId.map(Js.Global.clearInterval)

出于好奇,我将在选择答案之前留下显而易见的东西:

  switch (intervalId) {
    |Some(id) => Js_global.clearInterval(id)
    |None => ()
  }

Belt.Option.map(intervalId, Js.Global.clearInterval) 应该可以正常工作,除了它 returns 您需要以某种方式丢弃以避免类型错误或警告的值。

丢弃不需要的值的最安全方法是将其分配给通配符模式并包含类型注释以确保丢弃的值符合您的预期:

let _: option(unit) = Belt.Option.map(intervalId, Js.Global.clearInterval)

您还可以使用 ignore 函数,它在一系列管道的末尾特别有效,但请注意,您可能会不小心部分应用一个函数并在没有实际执行该函数的情况下丢弃它,并且调用 side-effect.

intervalId
  |> Belt.Option.map(_, Js.Global.clearInterval)
  |> ignore