2016-12-02 5 views
3

GHCJS 8.0.1でjavascriptにコンパイルするために、reflexプラットフォームでnixを使用しています。私はtextライブラリの内部モジュールに依存するいくつかの関数を書いています:Data.Text.Internal。私はこれから必要な唯一のものはTextのデータコンストラクタである:私はGHCJSと、このデータコンストラクタを使用してコードをコンパイルしようとすると、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) 

しかし、それは失敗します。私はこの問題を回避するためにコードのブロックの周りに#ifdef Sを置くことができることを理解

newtype Text = Text JSString 

:エラーメッセージは、それが明確に何とかということになり、どこかで、Textのデータコンストラクタは置き換えられています。しかし、私はこのデータコンストラクタの置き換えがどのように達成されたのか理解できません。これはghcjs-shimsのどこにも言及されていません。それはghcjsのいずれかであると言及されていません。より奇妙なことには、の通常のデータコンストラクタを使用する関数がghcjs-baseにあります。もし誰かが私をこの交換の源に向けることができたら、私は感謝します。

EDIT:これは質問には関係ありませんが、Textの内部構造を使用する必要がある理由は、IPv4アドレスやMACアドレスなどを効率的にエンコードするためです。私のbenchmarks I included with a previous questionでは、公開APIのtextを使った最速のIPv4エンコーディングが約450nsかかったことがわかりました。内部を使って(そして可変配列に直接書き込む)、私は約35nsでこれを行うことができます。性能は少なくとも10倍向上しています。

EDIT 2:私はちょうど質問に関連しているかもしれません他の何か私のコード内の別の場所で、私はからData.Text.Lazy.Builder.Intを使用していたことです。しかし、ghcjsでは、この関数はこのモジュールによってエクスポートされません。私はそれを上流のどこかに寄付するのがうれしいでしょうが、textのすべてのモジュールがどのようにシムになっているのか理解できないので、私はこれについて適切な上流がどこにあるのか分かりません。これが達成された特定のファイルを誰かが指摘できたら、私は感謝します。

+2

なぜ 'Text'表現の内部にアクセスする必要があるのか​​について詳しく知ることができますか? – Cactus

+0

@Cactusなぜ私は 'Text'の内部にアクセスする必要があるのか​​についての詳細を追加しました。 –

+1

私が尋ねる理由は、 'Data.Text.Internal'が、表現自体を見ることなく、あなたが望むことをするのに十分な機能を公開する必要があるからです。あなたのリンク先の質問に 'Text'-internals-using版が含まれていないようですので、私はまだ確かめることはできません。 – Cactus

答えて

6

reflex-platformを使用しているようです。最近、通常の実装ではなくJSStringをテキストに使用する変更を統合しました。これは、JSStringが劇的に高速で、純粋なHaskell Textの実装よりもはるかに少ないメモリを使用するためです。

これが実行しているのであれば、パフォーマンスにあまり気にしない限り、JSStringを使用することをおすすめします。しかし、この最適化を無効にしたい場合は、this blockをコメントアウトし、try-reflex/work-on/nix-shellを再入力するだけで動作するはずです。

+0

ありがとう!この最適化を有効にしておきたいのは間違いありません。また、 'text'スマートコンストラクターがまだ利用可能なので、変更可能な配列で作業し、必要なときにフリーズできます。この機能に関する他の一般的なフィードバックがある場合は、その場所を残しておくのに最適な場所はどこですか?リフレックスプラットフォームや他の場所のgithub問題ページで? –

+0

reflex-platformのgithubの問題はうまくいきます。また、ライブディスカッションのためにfreenode.irc.netの#reflex-frpに参加できます。 –

関連する問題