2016-12-02 61 views
3

我正在使用反射平台的nix将haskell编译为使用GHCJS 8.0.1的javascript。我已经编写了一些函数,它们依赖于text库中的内部模块:Data.Text.Internal。我从这个唯一需要的是数据构造函数TextGHCJS文本数据构造函数

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地址的东西。在我的benchmarks I included with a previous question中,我发现使用公共API text的最快IPv4编码花费了大约450ns。使用内部函数(并直接写入可变数组),我可以在大约35ns的时间内完成这个工作,至少性能提高10倍。

编辑2:我刚刚记得的其他东西(这可能与问题相关)是在我的代码中的另一个地方,我使用了Data.Text.Lazy.Builder.Inthexadecimal。但是,使用ghcjs时,此功能不会由此模块导出。我很乐意将它贡献给某个地方,但由于我不明白text中的所有模块是如何得到清除的,我不知道适合的上游是哪里。我很感激,如果有人能指出我完成这个特定的文件。

+2

您可以详细了解为什么您需要访问“文本”表示的内部? – Cactus

+0

@Cactus我添加了关于为什么我需要访问'Text'的内部细节。 –

+1

我问的原因是因为'Data.Text.Internal'应该公开足够的功能来做你想做的事情而不用去查看表示本身。您链接的前一个问题似乎没有包含“Text”内部使用版本,所以我无法确定。 – Cactus

回答

6

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

如果这就是你遇到的情况,我鼓励你坚持使用JSString,除非你对性能毫不关心。然而,如果你想禁用这种优化,我认为它应该只是将this block注释掉,然后重新输入你的try-reflex/work-on/nix-shell。

+0

谢谢!在启用此优化功能后,我确实很感兴趣,并且由于'text'智能构造函数仍然可用,所以我仍然可以处理可变数组并在需要时冻结它们。如果我对此功能有其他一般反馈,哪里是最适合离开的地方?在反射平台或其他地方的github问题页面上? –

+0

反射平台上的github问题效果很好,或者对于现场讨论,您可以通过freenode.irc.net上的#reflex-frp加入我们。 –