Javascript 从EventM中删除当前侦听器

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() 添加和删

假设我想使用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()
添加和删除,以及

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。。。
听众