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

回答