제안 된대로 VM을 설치했으며 현재는 this article입니다. 이제 저는 FFI 예제를 매우 초반부에 살펴보고 있습니다. ffi.jsexe/
폴더가 없으므로 (ghcjs-examples/weblog/ffi
) 나 혼자서 컴파일하려고했습니다. 나는 그렇게 나에게 어떤 일이 전혀 하스켈 및 FP에 새로 온 사람
{-# 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]
죄송합니다 :
여기
setTimeout($c, $1);: invalid placeholder, check function type: "$c"
이 빠른 우리가 ffi.hs
이 무엇인지 상기시켜 :하지만 다음과 같은 오류와 함께 실패 지금은 똑같은 마술. 나는 을 null
으로 바 꾸었습니다. 왜냐하면 delay
자체에는 단 하나의 인수 만 있기 때문에 의미가 있으므로 코드가 실행되지 않습니다. 그래서 컴파일되지만, 브라우저에서 열면 모든 숫자가 즉시 인쇄됩니다. 또한 약간의 사전 질문이 있습니다. setTimeout
일부 처리기 (정수 값) 반환 및 콜백 함수 및 시간을 걸립니다, 오른쪽에? 그렇다면 IO() -> Int -> IO Int
대신 delay
에 Int -> IO()
이라는이 유형의 서명이있는 이유는 무엇입니까?
그리고 주요 질문은 왜 컴파일을 거부합니까? 이 예가 오래된 것이므로 ghcjs
에서 변경된 사항이 있습니까? 현재 VM에
GHC 7.7.2
GHCJS 0.1.0
'Control.Concurrent.threadDelay'를 사용하면 GHCJS가 배관을 처리하도록 할 수 있습니다. –