1

我正在使用“Ramda/Fantasy”库来创建 Monads。我正在尝试结合 IO 从 DOM 中获取元素并更改其文本内容。但问题是改变元素内容的函数需要接受两个参数元素和我们想要设置的文本。我不知道如何有效地找到一个看起来像这样的解决方案:

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

getElement('h1').map(setElementText).runIO()('New Title').runIO();

有没有更好的办法?

4

2 回答 2

3

有助于您的示例的两个小更改:

  • 将参数的顺序交换为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()
于 2022-01-30T23:59:38.103 回答
0

我还找到了使用“ap()”方法的第二种解决方案,该方法将函数(由此 IO 实例中的操作产生)应用于给定 IO 实例中的操作产生的值。

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
于 2022-01-31T09:37:04.447 回答