我已经按照建议安装了 VM,现在正在阅读这篇文章。现在我一开始就在看 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
返回一些处理程序(整数值),并以毫秒为单位获取回调函数和时间,对吗?那么为什么delay
有这种类型的签名Int -> IO ()
而不是,比如说,IO () -> Int -> IO Int
?
主要问题是为什么它拒绝编译?这个例子是否已经过时并且本身已经改变了一些东西ghcjs
?
GHC 7.7.2
GHCJS 0.1.0