Javascript 外部monad没有monad约束的MaybeT应用程序实例

Javascript 外部monad没有monad约束的MaybeT应用程序实例,javascript,haskell,monad-transformers,applicative,Javascript,Haskell,Monad Transformers,Applicative,我正在Javascript中实现Maybe(akaOption)类型的monad转换器(请注意,我使用类型字典传递): const optOfT=of=>x=> of(optOf(x)); 常量opt=map=>f=>ttx=> map(optMap(f))(ttx); 常量optApT=chain=>ttf=>ttx=> 链(tf=> 链(tx=> optAp(tf)(tx)(ttx)(ttf); 常量optChainT=chain=>fm=>mmx=> 链(mx=> 光纤链(fm)(mx))

我正在Javascript中实现
Maybe
(aka
Option
)类型的monad转换器(请注意,我使用类型字典传递):

const optOfT=of=>x=>
of(optOf(x));
常量opt=map=>f=>ttx=>
map(optMap(f))(ttx);
常量optApT=chain=>ttf=>ttx=>
链(tf=>
链(tx=>
optAp(tf)(tx)(ttx)(ttf);
常量optChainT=chain=>fm=>mmx=>
链(mx=>
光纤链(fm)(mx))(mmx);
(map~
,ap~
,chain~
=t))->a(bs)->a(bt)
abf abs=纯()abf abs
这似乎正是我想要的,但我无法识别
pure()abf abs
的求值顺序以及哪个
操作符属于哪个应用层:

const optApT=(ap,of)=>ttf=>ttx=>
...?

任何提示都将不胜感激。

希望这有助于

以下是与各种类型类函数关联的类型:

abf <<**>> abs = pure (<*>) <*> abf <*> abs
                  (4)  (3)  (2)     (1)

(1), (2): the `ap` for type a
(3): the `ap` for type b
(4): the `pure` for type a
abf abs=pure()abf abs
(4)  (3)  (2)     (1)
(1) ,(2):a型的“ap”
(3) :b类的“ap”
(4) :a型的'pure'
评估顺序为:

(pure (<*>)) <*> abf <*> abs
(纯())abf abs

我就差那么一点点。下面是工作代码:
(ap,of)=>ttf=>ttx=>ap(ap(of(optAp))(ttf))(ttx)
。谢谢大家!
optAp
实际上可以简化为
(map,ap)=>ttf=>ttx=>ap(map(optAp)(ttf))(ttx)
。随着eta减少到
(map,ap)=>ttf=>ap(map(optAp)(ttf))
FP真是太棒了!