Javascript 从EventM中删除当前侦听器
假设我想使用ghcjs dom创建一个事件侦听器,该侦听器对单击作出响应,然后将其自身删除 我有Javascript 从EventM中删除当前侦听器,javascript,haskell,ghcjs,ghcjs-dom,Javascript,Haskell,Ghcjs,Ghcjs Dom,假设我想使用ghcjs dom创建一个事件侦听器,该侦听器对单击作出响应,然后将其自身删除 我有 addListener::(IsEventTarget t,IsEvent e) =>t->EventName t e->SaferEventListener t e->Bool->IO() removeListener::(IsEventTarget t,IsEvent e) =>t->EventName t e->SaferEventListener t e->Bool->IO() 添加和删
addListener::(IsEventTarget t,IsEvent e)
=>t->EventName t e->SaferEventListener t e->Bool->IO()
removeListener::(IsEventTarget t,IsEvent e)
=>t->EventName t e->SaferEventListener t e->Bool->IO()
添加和删除,以及
newListener::(IsEvent e)=>EventM t e()->IO(SaferEventListener t e)
用EventM
构造侦听器。如何从EventM
中访问SaferEventListener
(我将稍后构建),以便在事件发生时将其删除
在JavaScript中,使用命名函数表达式作为对addEventListener
的回调,然后在回调中对该名称应用removeEventListener
。但在这里似乎没有类似的可能。还是我遗漏了什么?使用fixIO
fixIO$\rec->newListener\u eventm
用您的eventm
填充\u eventm
,您将能够访问最终通过名称rec
创建的事件侦听器rec
将是newListener
调用的结果,但它可以在执行之前“使用”。我说“used”,是因为试图用seq
或任何更强大的命令来强制它将导致一个无限循环,但你应该做你正在做的事情
fixIO
是fix
的泛化:
——递归的本质
修正::(a->a)->a
固定f=设x=x中的fx
--同等,但性能较差,相关性较差
固定f=f(固定f)
--如果您使用过JS的“命名匿名函数”
--这似乎很熟悉
(修复(\n->
如果没有
fixIO f=ux——可怕的、不安全的代码
fixIO(\xs->return$1:xs)=return[1,1,1,1,1,1,1…]
fixIO return=fixIO(return.id)=return$fix id=return 124; 124;--oops!
fix
的思想是在函数实际创建之前将其最终结果提供给它。fixIO
的思想是在实际创建IO
函数之前将其最终结果提供给它,同时执行一些IO
操作。而且,fixIO
只执行这些操作一次,这就是为什么fix
的第一个定义(只调用f
一次)的原因比第二个更相关
fixIO
又是mfix::MonadFix m=>(a->ma)->ma
的一个特化,其中MonadFix
是允许这种打结语义的单子类(包括IO
,带有mfix=fixIO
),GHC支持任何MonadFix
的“递归do
”表示法:
{-#语言递归DO}
someCode=mdo。。。
监听器使用fixIO
fixIO$\rec->newListener\u eventm
用你的eventm
填充\u eventm
,你将能够访问最终通过名称rec
创建的事件侦听器rec
将是newListener
调用的结果,但它可以在执行之前被“使用”。我说“已使用,”因为试图用seq
或任何更强大的命令来强制它将导致一个无限循环,但你应该做好你正在做的事情
fixIO
是fix
的泛化:
——递归的本质
修正::(a->a)->a
固定f=设x=x中的fx
--同等,但性能较差,相关性较差
固定f=f(固定f)
--如果您使用过JS的“命名匿名函数”
--这似乎很熟悉
(修复(\n->
如果没有
fixIO f=ux——可怕的、不安全的代码
fixIO(\xs->return$1:xs)=return[1,1,1,1,1,1,1…]
fixIO return=fixIO(return.id)=return$fix id=return 124; 124;--oops!
fix
的思想是在函数实际创建之前将其最终结果提供给它。
fixIO
的思想是在实际创建IO
函数之前将其最终结果提供给它,同时执行一些IO
操作。而且,fixIO
只执行这些操作一次,这就是为什么fix
的第一个定义(只调用f
一次)的原因比第二个更相关
fixIO
又是mfix::MonadFix m=>(a->ma)->ma
的一个特化,其中MonadFix
是允许这种打结语义的单子类(包括IO
,带有mfix=fixIO
),GHC支持任何MonadFix
的“递归do
”表示法:
{-#语言递归DO}
someCode=mdo。。。
听众