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

+0

这里有一个版本的任而不是可能:https://www.webpackbin.com/bins/-Kh36r7GT7TR1ksMcWMM 也许这就是要走的路... –

回答