GHCJS文本数据构造函数

时间:2016-12-02 02:51:37

标签: haskell ghcjs

我正在使用带有reflex平台的nix来使用GHCJS 8.0.1将haskell编译为javascript。我编写了一些依赖于text库中的内部模块的函数:Data.Text.Internal。我唯一需要的是Text的数据构造函数:

data Text = Text
  {-# UNPACK #-} !A.Array -- payload (Word16 elements)
  {-# UNPACK #-} !Int     -- offset (units of Word16, not Char)
  {-# UNPACK #-} !Int     -- length (units of Word16, not Char)

但是,当我尝试使用GHCJS编译使用此数据构造函数的代码时,它会失败。错误消息清楚地表明,某处,Text的数据构造函数已被替换为:

newtype Text = Text JSString

我知道我可以将#ifdef放在代码块周围来解决这个问题。但是,我无法弄清楚这个数据构造函数替换是如何完成的。 ghcjs-shims中的任何地方都没有提到这一点。它没有提到ghcjs。甚至更奇怪的是ghcjs-base具有使用Text的普通数据构造函数的函数。如果有人能指出我替换的来源,我将不胜感激。

编辑:这与问题无关,但我需要使用Text内部的原因是有效地编码IPv4地址和MAC地址等内容。在我的benchmarks I included with a previous question中,我发现使用text的公共API的最快IPv4编码花费了大约450ns。使用内部(并直接写入可变数组),我可以在大约35ns内完成此操作,这至少可以提高性能的10倍。

编辑2:我记得的其他事情(可能与问题有关)是在我的代码的另一个地方,我使用了来自Data.Text.Lazy.Builder.Inthexadecimal。但是,使用ghcjs时,此模块不会导出此函数。我很乐意在某个地方向上游贡献它,但由于我不明白text中的所有模块是如何被填满的,我不知道适当的上游在哪里。如果有人能指出我完成此任务的特定文件,我将不胜感激。

1 个答案:

答案 0 :(得分:6)

看起来您可能正在使用reflex-platform。我们最近集成了一个使用JSString for Text的更改,而不是通常的实现;这是因为JSString比纯Haskell Text实现快得多,并且使用的内存要少得多。

如果这是你遇到的问题,我建议你坚持使用JSString,除非你对性能完全不关心。但是,如果您要禁用此优化,我认为只需注释this block然后重新输入您的try-reflex / work-on / nix-shell即可。