Как выполнить функцию, которая возвращает функцию внутри монады IO

Я использую библиотеку "Ramda/Fantasy" для создания монад. И я пытаюсь объединить IO, чтобы получить элемент из DOM и изменить его текстовое содержимое. Но проблема в том, что функция, которая изменяет содержимое элемента, должна принимать два аргумента: элемент и текст, который мы хотим установить. Я не знаю, как я могу так эффективно, я нашел одно решение, которое выглядит так:

Есть ли способ лучше?

2 ответа

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

  • Меняем порядок аргументов на setElementTextпозволяет частично применить текстовое значение.
  • С использованием chainскорее, чем mapубрать необходимость во втором runIOвызов.
      const getElement = id => IO(() => document.querySelector(id))
const setElementText = text => element => IO(() => element.textContent = text)

getElement('h1').chain(setElementText('New Title')).runIO()

Я также нашел второе решение для использования метода «ap()», который применяет функцию (полученную в результате действия в этом экземпляре ввода-вывода) к значению, полученному в результате действия в данном экземпляре ввода-вывода.

      import {IO} from "ramda-fantasy";

const getElement = id => IO(() => document.querySelector(id))
const setElementText = element => text => IO(() => element.textContent = text)

const someText = IO(() => 'New Title')

const setHeading = getElement('h1').map(setElementText).ap(someText).runIO();
setHeading.runIO(); // It works
Другие вопросы по тегам