1

我已经按照建议安装了 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
4

1 回答 1

4

在当前的虚拟机上,如果我interruptible改为safe在外部导入中写入,它可以工作。

于 2014-01-30T20:12:54.893 回答