gpt4 book ai didi

haskell - GHCJS 文本数据构造函数

转载 作者:行者123 更新时间:2023-12-02 18:50:53 27 4
gpt4 key购买 nike

我正在使用 nix 和 reflex 平台将 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 来解决这个问题。但是,我无法弄清楚这个数据构造函数替换是如何完成的。 ghcjs-shims 中没有提到这一点。也没有提到是 ghcjs 。更奇怪的是,ghcjs-base 具有使用 Text 的普通数据构造函数的函数。如果有人能指出我这个替代品的来源,我将不胜感激。

编辑:这与问题无关,但我需要使用 Text 内部的原因是对 IPv4 地址和 MAC 地址等内容进行有效编码。在我的benchmarks I included with a previous question ,我发现使用 text 公共(public) API 最快的 IPv4 编码大约需要 450ns。使用内部结构(并直接写入可变数组),我可以在大约 35 纳秒内完成此操作,这至少提高了 10 倍的性能。

编辑2:我刚刚记得的其他事情(可能与问题相关)是在我的代码中的另一个地方,我使用了 Data.Text.Lazy.Builder.Int 中的十六进制 。但是,对于 ghcjs,此模块不会导出此函数。我很乐意将其贡献给上游某个地方,但由于我不明白 text 中的所有模块是如何被填充的,所以我不知道合适的上游在哪里。如果有人能指出我完成此操作的特定文件,我将不胜感激。

最佳答案

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

如果这就是您遇到的情况,我鼓励您坚持使用 JSString,除非您不太关心性能。但是,如果您想禁用此优化,我认为只需注释掉 this block 就可以了。然后重新输入您的 try-reflex/work-on/nix-shell。

关于haskell - GHCJS 文本数据构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40923946/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com