ReasonML, побочный эффект на x, если опция Some (x) - PullRequest
0 голосов
/ 10 мая 2019

У меня есть let intervalId = option(Js.Global.intervalId)

Я хотел бы краткий способ сделать побочный вызов Js.Global.clearInterval, если у опции есть значение (т. Е. Some(id), а не None)

Возможно, ответом является функция Belt.Option.map, но у меня возникают проблемы с ее использованием.

Я очень плохо знаком с OCaml и ReasonML, но у нескольких известных мне языков есть подходящие функции.,Я перефразирую некоторые из них здесь, чтобы дать представление о том, что я ищу:

В Scala я бы сказал: intervalId.foreach(Js.Global.clearInterval)

В Swift я бы сказал: intervalId.map(Js.Global.clearInterval)

Ответы [ 2 ]

5 голосов
/ 10 мая 2019

Belt.Option.map(intervalId, Js.Global.clearInterval) должно работать нормально, за исключением того, что возвращает значение, которое вам нужно каким-то образом отбросить, чтобы избежать ошибки или предупреждения типа.

Самый безопасный способ отменить значения, которые вам не нужны, - это присвоить их шаблону подстановочных знаков и добавить аннотацию типа, чтобы гарантировать, что значение, которое вы отбрасываете, соответствует ожидаемому:

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

Вы также можете использовать функцию ignore, которая особенно хорошо работает в конце последовательности каналов, но имейте в виду, что вы можете затем случайно частично применить функцию и отменить ее, фактически не выполняя функцию и не вызывая побочную функцию. эффект.

intervalId
  |> Belt.Option.map(_, Js.Global.clearInterval)
  |> ignore
0 голосов
/ 10 мая 2019

Для любопытства я оставлю очевидное, что было здесь, перед выбранным ответом:

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