Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否有有效的数组monad转换器?_Javascript_Functional Programming_Monads_Monad Transformers - Fatal编程技术网

Javascript 是否有有效的数组monad转换器?

Javascript 是否有有效的数组monad转换器?,javascript,functional-programming,monads,monad-transformers,Javascript,Functional Programming,Monads,Monad Transformers,我知道如何实现单链表monad转换器,但无法运行它的数组对应项。问题是存在一种分组效应,使得变换器仅对交换基单子有效。下面是一个示例,为了简单起见,transformer和base monad都是数组,没有transformer类型的包装器: //数组 常量arrMap=f=>xs=> x.map((x,i)=>f(x,i)); 常数arrAp=tf=>xs=> arrFold(acc=>f=> arrAppend(acc) (arrMap(x=>f(x))(xs))) ([]) (tf);

我知道如何实现单链表monad转换器,但无法运行它的数组对应项。问题是存在一种分组效应,使得变换器仅对交换基单子有效。下面是一个示例,为了简单起见,transformer和base monad都是数组,没有transformer类型的包装器:

//数组
常量arrMap=f=>xs=>
x.map((x,i)=>f(x,i));
常数arrAp=tf=>xs=>
arrFold(acc=>f=>
arrAppend(acc)
(arrMap(x=>f(x))(xs)))
([])
(tf);
常数arrOf=x=>[x];
常量arrChain=mx=>fm=>
arrFold(acc=>x=>
arrAppend(acc)(fm(x))([])(mx);
//变压器
常量arrChainT=({map,ap,of,chain})=>mmx=>fmm=>
链(mmx)(mx=>{
常数go=([x,…xs])=>
x==未定义
([])的
:ap(map(arrCons)(fmm(x))(go(xs));
返回链(go(mx))(ys=>of(arrFold(arrAppend)([])(ys));
});
常数arrOfT=of=>x=>of([x]);
//变压器组
常量arrrchain=arrChainT(
{map:arrMap,ap:arrAp,of:arrOf,chain:arrChain});
常量arrArrOf=arrOfT(arrOf);
//辅助功能
常量arrFold=f=>init=>xs=>{
设acc=init;
for(设i=0;iys=>
xs.concat(ys);
常数arrCons=x=>xs=>
[x] .concat(xs);
//主要
foo=x=>
x==0
? [[0, 1]]
: [[0], [1]];
log(JSON.stringify(
arrArrChain(arrArrChain(foo(0))(foo))(foo));
//收益率[[0,1,0,0,1],[0,1,1,0,1],[0,1,0,0],[0,1,0,1],[0,1,1,0],[0,1,1,1]]
log(JSON.stringify(
arrArrChain(foo(0))(x=>arrArrChain(foo(x))(foo)));

//产生[[0,1,0,0,1],[0,1,0,0],[0,1,0,1],[0,1,1,0,1],[0,1,1,0],[0,1,1,1],[0,1,1],[0,1,0,1],[0,1,1]。
数组单声道转换器与列表单声道转换器相同

//步骤ma=null |{head:a,tail:ListT ma}
//列表m a=m(步骤m a)
//无:单子m->列表m a
常数nil=M=>M.pure(空);
//缺点:单子m->a->列表m a->列表m a
const cons=M=>head=>tail=>M.pure({head,tail});
//foldr:monadm->(a->mb->mb->mb->listtma->mb
常量foldr=M=>f=>a=>M=>M.bind(M)(步骤=>
步骤?f(步骤头部)(foldr(M)(f)(a)(步骤尾部)):a);
//附加:单子m->列表m a->列表m a->列表m a
const-append=M=>m1=>m2=>foldr(M)(cons(M))(m2)(m1);
//纯:单子m->a->列表m a
常数纯=M=>x=>cons(M)(x)(nil(M));
//绑定:Monad m->listtma->(a->listtmb)->listtmb
常量bind=M=>M=>f=>foldr(M)(x=>append(M)(f(x)))(nil(M))(M);
//单子列表:单子m->单子(列表m)
const MonadListT=M=>({pure:pure(M),bind:bind(M)});
//MonadArray:Monad数组
常量MonadArray={pure:x=>[x],bind:a=>f=>a.flatMap(f)};
//MonadListArray:Monad(列表数组)
常量monadlistaray=MonadListT(MonadArray);
//fromArray:Monad m->Array a->ListT m a
const fromArray=M=>a=>a.reduceRight((xs,x)=>cons(M)(x)(xs),nil(M));
//电梯:Monad m->m a->ListT m a
常数升力=M=>M=>M.bind(M)(纯(M));
//foo:Nat->ListT数组Nat
常量foo=x=>x==0
? fromArray(MonadArray)([0,1])
:升力(MonadArray)([0,1]);
//关联度:单子m->MA->(a->MB)->(b->MC)->MC
const associativityLHS=M=>M=>k=>h=>M.bind(M.bind(M)(k))(h);
//AssociationyRhs:Monad m->MA->(a->MB)->(b->MC)->MC
const associativityRHS=M=>M=>k=>h=>M.bind(M)(x=>M.bind(k(x))(h));
//lhs::ListT数组Nat
常数lhs=associativityLHS(MonadListArray)(foo(0))(foo)(foo);
//rhs::ListT数组Nat
常数rhs=关联度(MonadListArray)(foo(0))(foo)(foo);
log(JSON.stringify(lhs)==JSON.stringify(rhs));

log(JSON.stringify(lhs))数组的monad transformer实例将是相同的,因为它们是同构的。请注意,除非参数monad是可交换的,否则list monad transformer实例的a也不会生成monad。@AaditMShah我将Listt done right严格化,它仍然有效。我不想承认这一点,但你毕竟是对的。谢谢你添加了sigs类型。依我之见,你真的应该花一些时间教人。你的回答总是触及问题的核心,而不是拐弯抹角。他们假定有足够的先验知识,以便能够掌握。我曾在印第安纳大学担任计算机科学导论课程的助教。因此,我可能会开始一门在线课程,用JavaScript教授函数式编程。这将是一门非常基础的课程。我的目标受众是懂JavaScript但不懂函数式编程的人。我得在作业中考虑一下。如果你想帮忙,请告诉我。我认为让更多的人了解函数式编程的原理很重要。我将您的方法编码调整为我的函数编码,并尝试使
foldr
与Haskell中的implcit thunks一样不严格。虽然隐式thunks对算法应该是完全透明的,但它不起作用。只有当我在
append
中添加了
strict
combinator(类似于Haskell的bang模式)时,它才会这样做。这对我来说是一个激动人心的发现。