我正在使用nix与反射平台编译haskell到javascript与GHCJS 8.0.1。我编写了一些函数,这些函数依赖于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来解决这个问题。但是,我不知道这个数据构造函数替换是如何完成的。在ghcjs-shims中任何地方都没有提到这一点。也没有提到是ghcjs。更奇怪的是,ghcjs-base的函数使用了Text的正常数据构造函数。如果有人能告诉我这个替换的来源,我将不胜感激。
编辑:这与问题无关,但我需要使用Text内部的原因是为了高效地编码IPv4地址和MAC地址。在我的我在前一个问题中包括的基准中,我发现使用text的公共API进行最快的IPv4编码花费了大约450 my。使用内部(并直接写入可变数组),我可以在35 is左右完成这一任务,这至少可以提高10倍的性能。
编辑2:我刚刚想起的另一件事(可能与问题相关)是,在我的代码中的另一个地方,我使用了来自Data.Text.Lazy.Builder.Int的Data.Text.Lazy.Builder.Int。但是,对于ghcjs,这个函数不是由这个模块导出的。我很乐意把它贡献到上游的某个地方,但是由于我不知道text中的所有模块是如何被抛出的,所以我不知道哪里是合适的上游。如果有人能向我指出完成这一任务的特定文件,我将不胜感激。
https://stackoverflow.com/questions/40923946
复制相似问题