2
我正在尝试使用IO和Maybe monads来制作一个简单示例。该程序从DOM读取一个节点并向其写入一些innerHTML
。将Maybe和IO monads结合起来读取/写入
我挂断了IO和Maybe的结合,例如IO (Maybe NodeList)
。
如何在此设置下短路或发生错误?
我可以使用getOrElse
来提取一个值或设置一个默认值,但是将默认值设置为一个空数组并不会有所帮助。
import R from 'ramda';
import { IO, Maybe } from 'ramda-fantasy';
const Just = Maybe.Just;
const Nothing = Maybe.Nothing;
// $ :: String -> Maybe NodeList
const $ = (selector) => {
const res = document.querySelectorAll(selector);
return res.length ? Just(res) : Nothing();
}
// getOrElse :: Monad m => m a -> a -> m a
var getOrElse = R.curry(function(val, m) {
return m.getOrElse(val);
});
// read :: String -> IO (Maybe NodeList)
const read = selector =>
IO(() => $(selector));
// write :: String -> DOMNode -> IO
const write = text =>
(domNode) =>
IO(() => domNode.innerHTML = text);
const prog = read('#app')
// What goes here? How do I short circuit or error?
.map(R.head)
.chain(write('Hello world'));
prog.runIO();
https://www.webpackbin.com/bins/-Kh2ghQd99-ljiPys8Bd
这里有一个版本的任而不是可能:https://www.webpackbin.com/bins/-Kh36r7GT7TR1ksMcWMM 也许这就是要走的路... –