我正在使用反射平台的nix将haskell编译为使用GHCJS 8.0.1的javascript。我已经编写了一些函数,它们依赖于text
库中的内部模块:Data.Text.Internal
。我从这个唯一需要的是数据构造函数Text
:GHCJS文本数据构造函数
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.Int的hexadecimal
。但是,使用ghcjs时,此功能不会由此模块导出。我很乐意将它贡献给某个地方,但由于我不明白text
中的所有模块是如何得到清除的,我不知道适合的上游是哪里。我很感激,如果有人能指出我完成这个特定的文件。
您可以详细了解为什么您需要访问“文本”表示的内部? – Cactus
@Cactus我添加了关于为什么我需要访问'Text'的内部细节。 –
我问的原因是因为'Data.Text.Internal'应该公开足够的功能来做你想做的事情而不用去查看表示本身。您链接的前一个问题似乎没有包含“Text”内部使用版本,所以我无法确定。 – Cactus