İşte bunu yapmanın bir yolu. Bu ihraç etmek amacıyla
revString :: String -> String
revString = reverse
somethingUseful :: JSString -> IO JSString
somethingUseful = return . toJSString . revString . fromJSString
gibi, biz GHCJS.Foreign
içinde *Callback
işlevlerinden biri aracılığıyla bunu bir geri arama yapmak gerekir, biz bazı yararlı fonksiyonu var varsayalım. Ancak bu dönüş değeri göz ardı ediyorum, bu yüzden ikinci bir argüman haline sonucu koyar bir sarmalayıcı gerekir:
returnViaArgument :: (JSRef a -> IO (JSRef b)) -> JSRef a -> JSRef c -> IO()
returnViaArgument f arg retObj = do
r <- f arg
setProp "ret" r retObj
Benim main
geri çağırma işlevi oluşturur ve JavaScript küresel bir şeyden olarak kaydeder:
foreign import javascript unsafe "somethingUseful_ = $1"
js_set_somethingUseful :: JSFun a -> IO()
main = do
callback <- syncCallback2 NeverRetain False (returnViaArgument somethingUseful)
js_set_somethingUseful callback
Son olarak, JS tarafta biraz un-sarmalayıcı gerekir:
function somethingUseful (arg) {x = {}; somethingUseful_(arg, x); return x.ret};
ve şimdi bizim güzel Haskell-uygulanan işlevi kullanabilirsiniz:
somethingUseful("Hello World!")
"!dlroW olleH"
Bu hileyi gerçek dünyadaki bir uygulamada kullanıyorum. Cabal file'da executable
'un main-in
10 olarak tanımlanan JsInterface.hs'da, main
işlevi incredibleLogic_
global java komut değişkeni ayarlarken, JavaScript glue code parametreleri paketlemenin ve paketlerinin açılmasının üstesinden gelir.
[bu] (http://weblog.luite.com/wordpress/?p=14) hala geçerliyse bu hoş olmaz - eğer bu yönü istiyorsanız [fay] (https://github.com/ kötü kötü potansiyel sorunu çözmek için FFI kullanabilirsiniz gelirse faylang/fay/wiki/çağrılması-Fay-den-JavaScript) daha iyi bir seçim – Carsten
olabilir. Yani eğer var haskell = {}, export = functon (isim, val) {haskell [name] = val; }; 'Ve ardından' getirmek FFI aracılığıyla Haskell içine export', 'ihracat "sayHello" sayHello' potansiyel garip' h $ main olmadan fonksiyonu ne olursa olsun olmak 'haskell.sayHello', belirlesin()' herşeyi çöp değişkenler. –