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
のすべてのモジュールがどのようにシムになっているのか理解できないので、私はこれについて適切な上流がどこにあるのか分かりません。これが達成された特定のファイルを誰かが指摘できたら、私は感謝します。
なぜ 'Text'表現の内部にアクセスする必要があるのかについて詳しく知ることができますか? – Cactus
@Cactusなぜ私は 'Text'の内部にアクセスする必要があるのかについての詳細を追加しました。 –
私が尋ねる理由は、 'Data.Text.Internal'が、表現自体を見ることなく、あなたが望むことをするのに十分な機能を公開する必要があるからです。あなたのリンク先の質問に 'Text'-internals-using版が含まれていないようですので、私はまだ確かめることはできません。 – Cactus