Как выполнить функцию, которая возвращает функцию внутри монады 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