我已經按照建議安裝了VM,現在正在閱讀this article。現在我剛開始看FFI的例子。我丟失ffi.jsexe/
文件夾(在ghcjs-examples/weblog/ffi
之內),並試圖自行編譯它。但它失敗,以下錯誤:
setTimeout($c, $1);: invalid placeholder, check function type: "$c"
這裏是快速提醒一下我們在ffi.hs
:
{-# LANGUAGE JavaScriptFFI, CPP #-}
module Main where
#ifdef __GHCJS__
foreign import javascript unsafe "document.write($1+'<br/>');" writeNumber :: Int -> IO()
foreign import javascript safe "setTimeout($c, $1);" delay :: Int -> IO()
#else
writeNumber = error "writeNumber: only available from JavaScript"
delay = error "delay: only available from JavaScript"
#endif
main :: IO()
main = mapM_ (\x -> writeNumber x >> delay 1000) [1..1000]
對不起,我是新來的Haskell和FP可言,所以有些事情對我來說是就像現在一樣。 我已將$c
替換爲null
,因爲它有意義,因爲delay
本身只有一個參數,因此不會執行代碼。所以它編譯,但是當我在瀏覽器中打開它時,所有數字都會立即打印出來。 另外我有一個小問題。 setTimeout
返回一些處理函數(整數值),並以ms爲單位回調函數和時間,對嗎?那麼爲什麼delay
有這種類型的簽名Int -> IO()
而不是,比如說IO() -> Int -> IO Int
?
而主要問題是爲什麼它拒絕編譯?這個例子是否過時,ghcjs
本身有什麼改變?
GHC 7.7.2
GHCJS 0.1.0
您可以使用Control.Concurrent.threadDelay讓GHCJS爲您處理管道。 –