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 也許這就是要走的路... –