我正在使用带有reflex平台的nix来使用GHCJS 8.0.1将haskell编译为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
的公共API的最快IPv4编码花费了大约450ns。使用内部(并直接写入可变数组),我可以在大约35ns内完成此操作,这至少可以提高性能的10倍。
hexadecimal
。但是,使用ghcjs时,此模块不会导出此函数。我很乐意在某个地方向上游贡献它,但由于我不明白text
中的所有模块是如何被填满的,我不知道适当的上游在哪里。如果有人能指出我完成此任务的特定文件,我将不胜感激。
答案 0 :(得分:6)
看起来您可能正在使用reflex-platform。我们最近集成了一个使用JSString for Text的更改,而不是通常的实现;这是因为JSString比纯Haskell Text实现快得多,并且使用的内存要少得多。
如果这是你遇到的问题,我建议你坚持使用JSString,除非你对性能完全不关心。但是,如果您要禁用此优化,我认为只需注释this block然后重新输入您的try-reflex / work-on / nix-shell即可。