我试图为某些JS库构建JS FFI以使其与GHCJS一起工作,我需要将列表转换为单个JSVal
listToJSVal :: PToJSVal a => [a] -> JSVal
listToJSVal = map pToJSVal
但得到错误
Couldn't match type ‘[JSVal]’ with ‘JSVal’
Expected type: [a] -> JSVal
Actual type: [a] -> [JSVal]
显然,我需要concat函数,但使用mconcat
给出
Could not deduce (Monoid JSVal) arising from a use of ‘mconcat’
from the context (PToJSVal a)
bound by the type signature for
也许,如何正确地进行这种转换有更简单的方法?
答案 0 :(得分:2)
你也可以手头转换它:
{-# LANGUAGE QuasiQuotes #-}
import GHCJS.Marshal.Pure
import GHCJS.Types
import GHCJS.Foreign.QQ
import GHCJS.Prim
listToJSVal :: PToJSVal a => [a] -> JSVal
listToJSVal xs = foldl push ar xs
where ar = [js'| [] |]
push as x = [js'| { `as.push(`x); $r = `as } |]
printArray :: JSVal -> IO ()
printArray as = [js_| for(i = 0;i < `as.length;i++) { console.log(`as[i]) } |]
main = do
printArray $ listToJSVal ([1,2,3,4,5]::[Int])
答案 1 :(得分:1)
似乎pToJSVal
仅为基本类型定义。
为了将任意值转换为JS,我会尝试在GHCJS / Marshal / Internal.hs (link)中定义的toJSVal
和toJSValListOf
函数