我正在努力理解JavaScript中的单元函数.特别是因为让我'得到'monad(或至少我认为)的东西是Promise对象,以及如何then总是返回一个新的Promise,无论你传递给哪个函数then,据我所知,这相当于bind或者>>=在haskell中.这对我来说是完全有意义的,因为它确保你所有的功能都在'monad universe'中执行,可以这么说.
让我振作起来的是Douglas Crockford的"Monads and Gonads"演讲.在他的实现中,bind直接返回transform函数的结果,而不检查结果本身是否为monad.这与Promises的then方法发生冲突,因为thenALWAYS会返回一个新的Promise.
一种想法是提升方法.他的实施确保'升力'将永远返回monad,并且可能then被提升到Promise.但是,这意味着then !== bind,并且Promise在某处具有内部绑定.
我的直觉是,在绑定函数中至少应该进行某种类型的检查,检查转换的结果,并允许生成的monad被允许通过,但是会拦截非monad并再次通过它们,就像'升力'确实如此.
*编辑
此外,我的印象then相当于bind, flatMap, >>=因为它有能力打开其他monad,包括不同的monads和它自己的类型.在查看JavaScript中的一些类别理论引用时,flatMap用于映射一组嵌套数组,然后将它们展平为一维.这适合于如何then等待你提供的其他承诺.但似乎与上面提到的原始实现不匹配.我感到失落.
任何拥有更多FP经验的人都会对我所缺少的东西有所了解,或者我是否太过分了,需要从头开始?
一些代码示例......
// Crockford's 'bind'
monad.bind = function(transform) {
// value was passed in through the unit constructor
return transform(value);
}
Run Code Online (Sandbox Code Playgroud)
我的麻烦区
// Set the 'isMonad' prop to be true, for all
// monads made with the MONAD macroid
monad.isMonad …Run Code Online (Sandbox Code Playgroud)