javascript - 如何在 GHCJS 上将未装箱的 Vector 转换为 JS TypedArray?

标签 javascript haskell ghcjs

我有一个 Data.Vector.Unboxed.Vector Word32 类型的元素。我想将其转换为原生 JS TypedArray(特别是 Uint32Array)。我知道 toJsArraytoJsValListOf,但这两个函数都处理列表,而不是向量,而且效率低下。如何将未装箱的 Vector 直接转换为 JS TypedArray

最佳答案

我能够解决这个问题,直到编码为 Int32Array 而不是 Uint32Array;可能真正了解 GHCJS 超过一个小时的人将能够对此进行扩展,以便您获得 Uint32Array (或者您可以制作一个破解版本支持 getUint32Array 操作的 GHCJS.Buffer

想法是获取 Vector 表示形式的 ByteArray,然后对其进行切片,以便仅保留相关部分:

import Data.Vector.Unboxed as V
import Data.Word

import qualified Data.Vector.Unboxed.Base as B
import qualified Data.Vector.Primitive as P
import GHCJS.Types
import qualified GHCJS.Buffer as Buffer
import JavaScript.TypedArray (Int32Array)

-- TODO: generalize this to all types that support unboxed vectors...
toI32Array :: Vector Word32 -> Int32Array
toI32Array (B.V_Word32 (P.Vector offset len bs)) =
    js_slice offset (offset + len) $ Buffer.getInt32Array (Buffer.fromByteArray bs)


foreign import javascript unsafe "$3.slice($1, $2)" js_slice :: Int -> Int -> Int32Array -> Int32Array
-- should be
-- foreign import javascript unsafe "$3.slice($1, $2)" js_slice :: Int -> Int -> SomeTypedArray a m -> SomeTypedArray a m
-- but alas, JavaScript.TypedArray.Internal.Type is a hidden module

下面是一些使用它的示例代码:

v :: Vector Word32
v = V.fromList [1, 2, 3]

foreign import javascript unsafe "console.debug($1);" js_debug :: JSVal -> IO ()

main = do
    let v' = toI32Array v
    js_debug $ jsval v'

如果您在浏览器中查看控制台,您可以检查 jsval v' 确实具有 Int32Array 类型。

关于javascript - 如何在 GHCJS 上将未装箱的 Vector 转换为 JS TypedArray?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34406652/

相关文章:

haskell - 查看 GHCi 中 TVar 的值

haskell - 使用 ghcjs 将 Haskell 模块编译为 Javascript

javascript - 在 GHCJS 中调用 emscripten 导出的导入

javascript - 不断收到未捕获的类型错误 : Illegal invocation?

javascript - 如何解决与 jQuery + 其他库的冲突问题

javascript - 为什么我不能在 jQuery 中使用 .css() 更改行高 CSS 属性?

haskell - 是否可以使用 Ghcjs、Haste、Elm 等在服务器端渲染 Haskell 前端?

javascript - 使用 JavaScript/Hammer.js 检测 Android 缩放 innerWidth

haskell - 不理解 Fay 中的 liftM2 行为

haskell - 将新的 FFI 方法插入 GHC