Haskell GHCJS文本数据构造函数

Haskell GHCJS文本数据构造函数,haskell,ghcjs,Haskell,Ghcjs,我使用nix和Reflect平台将haskell编译成带有GHCJS 8.0.1的javascript。我已经编写了一些依赖于text库中的内部模块的函数:Data.text.internal。我唯一需要的是Text的数据构造函数: data Text = Text {-# UNPACK #-} !A.Array -- payload (Word16 elements) {-# UNPACK #-} !Int -- offset (units of Word16, not Cha

我使用nix和Reflect平台将haskell编译成带有GHCJS 8.0.1的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垫片中的任何地方都没有提及。也没有提到的是ghcjs。更奇怪的是,
ghcjsbase
的函数使用了
Text
的常规数据构造函数。如果有人能告诉我这个替代品的来源,我将不胜感激

编辑:这与问题无关,但我需要使用
Text
的内部结构的原因是为了有效地编码IPv4地址和MAC地址等内容。在我的研究中,我发现使用
text
公共API的最快IPv4编码大约需要450ns。使用内部构件(并直接写入可变数组),我可以在大约35ns的时间内完成这项工作,这至少使性能提高了10倍


编辑2:我刚刚记得的另一件事(可能与问题有关)是,在我代码的另一个地方,我使用了来自的
hexadecimal
。但是,对于ghcjs,此模块不会导出此功能。我很乐意将其上传到某个地方,但由于我不明白
text
中的所有模块是如何被填充的,因此我不知道该上传到哪里。如果有人能给我指出完成此操作的具体文件,我将不胜感激。

您可能正在使用。我们最近集成了一个更改,将JSString用于文本,而不是通常的实现;这是因为JSString比纯Haskell文本实现速度快得多,占用的内存也少得多


如果这就是您遇到的问题,我建议您坚持使用JSString,除非您对性能毫不关心。但是,如果要禁用此优化,我认为只需注释掉,然后重新输入try reflect/work on/nix shell就可以了。

你能详细说明为什么需要访问
文本
表示的内部吗?@Cactus我添加了关于为什么需要访问
文本
的内部的详细信息。我问的原因,是因为
Data.Text.Internal
应该公开足够的功能,以便在不查看表示本身的情况下执行所需的操作。您链接的上一个问题似乎不包含使用版本的
文本
-内部函数,因此我还不能确定。我已经查看了
Data.Text.Internal
中的其他函数,看起来
文本
函数在大多数情况下都能满足我的需要。然而,我一直在研究其他一些文本生成器抽象,我需要这样的东西:
textToMArray::text->ST s(TA.MArray s)
。这会将一段文本复制到新的缓冲区中。当我有权访问数据构造函数时,我可以编写这个,但我认为
data.Text.Internal
中的任何其他内容都不允许我这样做。不过,我也许能解决这个问题。另外,我还想知道数据构造函数switcharoo发生在哪里。如果能看到关于这个的现有讨论在哪里也会很好。我猜测,一个长期目标是将ghcjs特定的内容推入
文本
本身(在
ifdef
s后面)。我对github问题跟踪程序的粗略阅读并没有提到这一点,但我怀疑我只是在错误的地方寻找信息。谢谢!我对打开这个优化非常感兴趣,因为
text
智能构造函数仍然可用,我仍然可以处理可变数组,并在需要时冻结它们。如果我对该功能有其他一般性反馈,那么最合适的地方是哪里?在Reflect platform的github问题页面或其他地方?Reflect platform上的github问题运行良好,或者在现场讨论中,您可以加入我们在freenode.irc.net上的#reflect frp。