3

我正在使用带有反射平台的 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在代码块周围放置 s 来解决这个问题。但是,我无法弄清楚这个数据构造函数替换是如何完成的。中的任何地方都没有提到这一点ghcjs-shims。也没有提到ghcjs。更奇怪的是,它ghcjs-base具有使用普通数据构造函数的函数Text。如果有人能指出这个替换的来源,我将不胜感激。

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

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

4

1 回答 1

6

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

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

于 2016-12-05T19:16:05.950 回答