我已经按照建议安装了VM,现在正在阅读本文。现在我刚开始看外国金融机构的例子。我丢失了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都是新手,所以有些事情对我来说现在就像魔法一样。我用null
替换了$c
,因为delay
本身只有一个参数,因此不会执行任何代码。所以它可以编译,但当我在浏览器中打开它时,所有的数字都会立即打印出来。我还有一个小问题。setTimeout
返回一些处理程序(整数值),并使用回调函数,时间以毫秒为单位,对吗?那么,为什么delay
具有这种类型的签名Int -> IO ()
,而不是IO () -> Int -> IO Int
呢?
主要的问题是它为什么拒绝编译?这个例子是不是已经过时了,ghcjs
本身也发生了一些变化?
GHC 7.7.2
GHCJS 0.1.0
在当前VM上,如果我在外部导入中写入interruptible
而不是safe
,它就可以工作。