如何执行 returns IO monad 中的函数

How to execute a function that returns a function inside of IO monad

我正在使用“Ramda/Fantasy”库来创建 Monad。我正在尝试结合 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();

有没有更好的方法?

两个小的变化来帮助你的例子:

  • 将参数的顺序交换为 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()”方法的第二种解决方案,该方法将函数(由此 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