Я использую nix с рефлекторной платформой для компиляции haskell в javascript с помощью GHCJS 8.0.1. Я написал несколько функций, которые полагаются на внутренний модуль в библиотеке 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
. Я был бы признателен, если бы кто-нибудь мог указать мне на источник этой замены.
EDIT: Это не относится к вопросу, но причиной, по которой мне нужно использовать внутренние компоненты Text
, является эффективное кодирование таких объектов, как адреса IPv4 и MAC-адреса. В моем benchmarks I included with a previous question я обнаружил, что самая быстрая кодировка IPv4 с использованием общедоступного API text
занимает около 450 нс. Используя внутренние элементы (и записывая непосредственно в изменяемый массив), я могу сделать это примерно в 35 нс, что, по крайней мере, на 10-кратном улучшении производительности.
EDIT 2: Что-то еще, что я только что вспомнил (что, возможно, имеет отношение к вопросу), заключается в том, что в другом месте моего кода я использовал hexadecimal
от Data.Text.Lazy.Builder.Int. Однако с помощью ghcjs эта функция не экспортируется этим модулем. Я был бы рад внести его в исходное место где-то, но так как я не понимаю, как все модули в text
выходят из строя, я не знаю, где находится соответствующий выход для этого. Я был бы признателен, если бы кто-то мог указать мне на конкретный файл, где это выполняется.
Можете ли вы подробно рассказать о том, почему вам нужен доступ к внутренним представлениям «Текст»? – Cactus
@Cactus Я добавил подробности о том, почему мне нужно получить доступ к внутренним текстам «Текст». –
Причина, по которой я спрашиваю, заключается в том, что 'Data.Text.Internal' должен предоставить достаточную функциональность, чтобы делать то, что вы хотите, не глядя на само представление. Ваш связанный предыдущий вопрос, похоже, не содержит версию «Text»-internalals, поэтому я пока не могу сказать наверняка. – Cactus