これを機能させる方法を次に示します。次のような便利な関数があるとします。
revString :: String -> String
revString = reverse
somethingUseful :: JSString -> IO JSString
somethingUseful = return . toJSString . revString . fromJSString
*Callback
それをエクスポートするには、 の関数の 1 つを介してコールバックにする必要がありますGHCJS.Foreign
。ただし、これらは戻り値を破棄するため、結果を 2 番目の引数に入れるラッパーが必要です。
returnViaArgument :: (JSRef a -> IO (JSRef b)) -> JSRef a -> JSRef c -> IO ()
returnViaArgument f arg retObj = do
r <- f arg
setProp "ret" r retObj
私のmain
関数はコールバックを作成し、それを JavaScript に対してグローバルなものとして保存します。
foreign import javascript unsafe "somethingUseful_ = $1"
js_set_somethingUseful :: JSFun a -> IO ()
main = do
callback <- syncCallback2 NeverRetain False (returnViaArgument somethingUseful)
js_set_somethingUseful callback
最後に、JS 側で少しアンラッパーが必要です。
function somethingUseful (arg) {x = {}; somethingUseful_(arg, x); return x.ret};
これで、Haskell で実装された素敵な関数を使用できるようになりました。
somethingUseful("Hello World!")
"!dlroW olleH"
私はこのトリックを実際のアプリケーションで使用しています。Cabal ファイルの時点で定義されているJsInterface.hsでは、関数がグローバル Java スクリプト変数を設定し、JavaScript グルー コードがパラメーターのパックとアンパックを処理します。main-in
executable
main
incredibleLogic_