gpt4 book ai didi

ffi - 使用 purescript 的 FFI 调用带有回调的 js 函数

转载 作者:行者123 更新时间:2023-12-04 06:07:47 25 4
gpt4 key购买 nike

我正在尝试从 purescript 调用 navigator.geolocation.getCurrentPosition javascript 函数,但遇到了两个问题。

在 javascript 中,它会被调用类似

navigator.geolocation.getCurrentPosition(function(position) { ... });

其中位置是一个对象。

首先,我不知道返回类型应该是什么,因为它不返回任何内容,而是调用回调。

其次,我不知道回调使用什么类型,因为函数不能是纯的,因为它的结果不会被返回。

目前为止

foreign import geolookup "function (callback) {\
navigator.geolocation.getCurrentPosition(callback);
\}" :: forall eff a. Eff (geolookup :: GeoLookup | eff) {}

geolookup \position -> ...

所以这里我对外部函数的类型签名是 forall eff a。 Eff (geolookup::GeoLookup | eff) {},但是我知道在 Eff 之前也应该有一个回调参数。我只是不确定如何编写类型签名或实现它。

最佳答案

Firstly, I don't know what the return type should be as it doesn't return anything, but instead calls a callback.

您已正确地将返回类型标识为 Unit{},但 geolookup 函数本身是有效的,因此应该是用 Eff 类型构造函数包裹。

Secondly, I don't know what type to use for the callback, as the function can't be pure as it's result won't be returned.

所以让我们给回调一个合适的类型。作为一个有效的函数,像 a -> Eff _ b 这样的函数是有意义的,为了避免行中重复的标签,我们不得不在行中包含 GeoLookup 效果.所以让我们给回调类型 Position -> Eff (geolookup::GeoLookup | eff) Unit

那么我们函数的完整类型就变成了

foreign import data Position :: *

geolookup :: forall eff. (Position -> Eff (geolookup :: GeoLookup | eff) Unit) ->
Eff (geolookup :: GeoLookup | eff) Unit

在 FFI 中,我们可以包装 navigator.geolocation.getCurrentPosition 调用以兼容此类型。使用 0.7 编译器中的 FFI 样式:

exports.geolookup = function(callback) {
return function() { // Outer Eff
navigator.geolocation.getCurrentPosition(function(p) {
callback(p)(); // Extra () due to inner Eff
});
};
};

此时,您可能希望研究像 ContTAff 这样的类型,以便以更可组合的方式包装您的函数。

您可能想阅读 how to use the Eff monad 上的文章.

关于ffi - 使用 purescript 的 FFI 调用带有回调的 js 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31563870/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com