3

purescript から javascript 関数を呼び出そうとしていますnavigator.geolocation.getCurrentPositionが、2 つの問題に遭遇しました。

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 の前にもコールバック パラメータが必要であることはわかっています。型シグネチャの書き方や実装方法がわかりません。

4

1 に答える 1

8

まず、何も返さず、代わりにコールバックを呼び出すため、戻り値の型がどうあるべきかわかりません。

戻り値の型をUnit、 またはとして正しく識別しまし{}たが、関数自体は効果的であるため、型コンストラクターgeolookupでラップする必要があります。Eff

第二に、結果が返されないため、関数を純粋にすることはできないため、コールバックに使用する型がわかりません。

それでは、コールバックに適切な型を与えましょう。効果的な関数として、次のようなものa -> Eff _ bは理にかなっています。行でラベルが重複しないようにするために、行にGeoLookup効果を含める必要があります。では、コールバックに type を指定しましょう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
    });
  };
};

この時点で、次のような型を調べたり、より構成可能な方法で関数をラップしContTたりすることをお勧めします。Aff

Eff モナドの使い方に関する記事を読みたいと思うかもしれません。

于 2015-07-22T17:39:12.600 に答える