Haskell Fay序列异步调用

3

最近,我决定将一些JavaScript代码转换成Fay,以便我可以保证类型正确性,并且可以以整洁的方式处理异步(也为了进行实验)。我已经构建了一些JavaScript对象,其唯一目的是同步并行Ajax调用。我对Haskell还不太熟悉。

在Fay中,我希望发出一些ajax调用,并使用Control.Monad.Parallel.sequence进行同步。然而,我卡住了,急需指导,因为fay-jquery AJAX functions没有返回成功/失败回调的monad,this example in the fay snaplet也没有。它们都返回一个Fay() monad,似乎只是将惰性Haskell调用序列化为严格的JavaScript语句,而我原本期望获得类似于(Fay(), IO(Either SuccessResult FailureResult))的元组,因为发出AJAX请求会导致两个不同的动作。

我有很多关于这个问题的问题:

  1. 延续单子是我要找的东西吗?
  2. 有没有与 Fay 兼容并使用此单子进行异步 JavaScript 的模块?
  3. 由于 fay-jquery 的 AJAX 函数 的副作用发生在返回的 Fay () 之后绑定或序列化的任何内容,这是否使函数不纯?
  4. 我注意到 Fay 存储库中有一个 延续单子 - 为什么它没有在 Fay 中使用?我唯一能找到的就是 这个包装异步 node.js fs 调用的 gist

非常感谢您的回答!它们将极大地帮助我对这些内容的理解。

1个回答

2
  1. 是的,Cont实例基本上可以做到您想要的事情,但没有错误处理。
  2. ^
  3. 这取决于“不纯”的定义。我认为,在执行其所有作用之前返回的函数仍然可以是纯函数。这对于Haskell中几乎所有懒计算都是如此。例如,可以参见Haskell的forkIO :: IO () -> IO ThreadId
  4. 我不确定您指的是“在Fay本身中”是什么意思。我认为Prelude不应使用它,但其他库可以使用Cont。如果您希望这样做,请随意将示例制作为包。

谢谢您的回答。我已经自己进行了研究,并确定扩展Cont示例确实是我想要的。这个示例是必要的,因为Control.Monad.Cont依赖于Fay不支持的类型类。 - user1158559
当一个函数具有副作用时,要使其成为纯函数,它必须返回这些副作用的表示。例如,forkIO会立即返回类型为IO ThreadID的某个东西,它代表将来创建线程的副作用。由于将函数绑定到fay monad只意味着该函数在生成Fay monad的函数之后立即执行,因此Fay monad肯定不代表AJAX调用成功或失败的副作用,因此AJAX调用必须是不纯的。 - user1158559
4 是一个好的观点 - Fay 本身作为 Haskell 到 JS 编译器对于 continuation monad 没有用处。然而,我想知道它是否可以非常有用地弥合 Javascript 的回调和 Haskell 处理异步的 monads 之间的差距。就个人而言,我研究 Fay 的动机之一是看看是否可以使用 monads 以更清晰的方式同步异步调用。 - user1158559
我也打算尝试一下GHCJS。 - user1158559
刚刚注意到你是 Fay 的合著者!非常令人印象深刻,谢谢你! - user1158559

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接