如何将列表转换为JSVal?

时间:2016-06-16 13:54:07

标签: haskell ghcjs

我试图为某些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

也许,如何正确地进行这种转换有更简单的方法?

2 个答案:

答案 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)中定义的toJSValtoJSValListOf函数