最简单的Javascript单子实现

最简单的Javascript单子实现,javascript,promise,functional-programming,monads,Javascript,Promise,Functional Programming,Monads,任何人都可以使用monad或类似的FP实现来解决下面的挑战(即映射到数据库)吗(注意,这可以用Javascript开发人员熟悉的方式完成吗) constdatagood=[{a:{b:1},{a:{b:2},{a:{b:3}] const dataBad=[{a:{b:1},{a:{b:2},{b:{c:3}] //返回数组 返回数据良好 .map(obj=>obj.a)/[{b:1},{b:2},{b:3}] .map(obj=>obj.b+1)/[2,3,4] //中断应用程序 返回数据条

任何人都可以使用monad或类似的FP实现来解决下面的挑战(即映射到
数据库
)吗(注意,这可以用Javascript开发人员熟悉的方式完成吗)


constdatagood=[{a:{b:1},{a:{b:2},{a:{b:3}]
const dataBad=[{a:{b:1},{a:{b:2},{b:{c:3}]
//返回数组
返回数据良好
.map(obj=>obj.a)/[{b:1},{b:2},{b:3}]
.map(obj=>obj.b+1)/[2,3,4]
//中断应用程序
返回数据条
.map(obj=>obj.a)/[{b:1},{b:2},未定义]
.map(obj=>obj.b+1)//TypeError:无法读取未定义的属性“b”
可能的答案:如果
Promise
本质上是monad,那么这不是最简单的/javascript风格的monad实现吗

const Maybe=val=>newpromise(解析=>resolve(val))
constdatagood=[{a:{b:1},{a:{b:2},{a:{b:3}]
const dataBad=[{a:{b:1},{a:{b:2},{b:{c:3}]
//返回空值
返回等待可能(数据条)
.then(val=>val.map(obj=>obj.a))/[{b:1},{b:2},未定义]
.then(val=>val.map(obj=>obj.b+1))//类型错误:无法读取未定义的属性“b”
.catch(()=>null)

1.0001本质上是1——虽然这样的说法在周日市场上有意义,但在数学和FP上却没有意义。从FP的角度来看,promise是一个无法无天的抽象,就像一个非常可爱的家伙:数据单子的函数实例非常简单:
bind=f=>g=>x=>g(f(x))(x)
。它与函数组合一起形成一个单子。身份单子更简单,但很难掌握,因为它除了遵守单子定律之外没有任何用处。@bob最简单的单子就是自由单子。不,承诺会造成可怕的monad,而且它们会在您不需要的地方强制异步。不要那样做。您真正想要使用的是
数组
monad,带有
dataBad.flatMap(obj=>“a”在obj?[obj.a]:[])
。尽管在这种特殊情况下,使用特定于数组的
filter
方法更好(也更简单),比如
dataBad.filter(obj=>“a”在obj.map(obj=>obj.a.b+1)
。这听起来像是一个错误。你到底想做什么?