2014-01-07 29 views
1

我已經按照建議安裝了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 
+0

您可以使用Control.Concurrent.threadDelay讓GHCJS爲您處理管道。 –

回答

4

在當前VM,如果我寫interruptible在國外進口,而不是safe,它的工作原理。

+0

我會檢查出來。 –