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