2

我正在尝试为一些 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

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

4

2 回答 2

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])
于 2016-08-10T20:05:28.057 回答
1

似乎pToJSVal只为基本类型定义。

为了将任意值转换为 JS,我会尝试 GHCJS/Marshal/Internal.hs 中定义的toJSValtoJSValListOf函数(链接)

于 2016-06-16T15:17:07.290 回答