2016-12-02 3 views
3

Я использую 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 выходят из строя, я не знаю, где находится соответствующий выход для этого. Я был бы признателен, если бы кто-то мог указать мне на конкретный файл, где это выполняется.

+2

Можете ли вы подробно рассказать о том, почему вам нужен доступ к внутренним представлениям «Текст»? – Cactus

+0

@Cactus Я добавил подробности о том, почему мне нужно получить доступ к внутренним текстам «Текст». –

+1

Причина, по которой я спрашиваю, заключается в том, что 'Data.Text.Internal' должен предоставить достаточную функциональность, чтобы делать то, что вы хотите, не глядя на само представление. Ваш связанный предыдущий вопрос, похоже, не содержит версию «Text»-internalals, поэтому я пока не могу сказать наверняка. – Cactus

ответ

6

Похоже, вы можете использовать reflex-platform. Недавно мы интегрировали изменение, которое использует JSString для текста, а не обычную реализацию; это потому, что JSString значительно быстрее и использует намного меньше памяти, чем реализация pure-Haskell Text.

Если это то, к чему вы работаете, я бы посоветовал вам придерживаться JSString, если вы совершенно не заботитесь о производительности. Однако, если вы хотите отключить эту оптимизацию, я думаю, что нужно просто прокомментировать this block, а затем снова ввести ваш try-reflex/work-on/nix-shell.

+0

Спасибо! Мне определенно интересно оставить эту оптимизацию включенной, и поскольку интеллектуальный конструктор 'text' по-прежнему доступен, я все еще могу работать с изменяемыми массивами и замораживать их, когда это необходимо. Если у меня есть другие общие отзывы об этой функции, где это самое подходящее место для ее выхода? На странице github для рефлекса-платформы или где-то еще? –

+0

Проблема с github на рефлекторной платформе работает хорошо, или для живой дискуссии вы можете присоединиться к нам в # reflex-frp на freenode.irc.net. –

Смежные вопросы