GHCJS: setTimeout($c, $1);: 无效占位符, 检查函数类型: "$c"



我已经按照建议安装了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,它就可以工作。

最新更新