私は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
これを回避するために、コード ブロックの周りに sを配置できることを理解しています。ただし、このデータ コンストラクターの置き換えがどのように行われたかはわかりません。これは のどこにも言及されていませんghcjs-shims
。それも言及されていませんghcjs
。さらに奇妙なのはghcjs-base
、 に通常のデータ コンストラクターを使用する関数があることですText
。誰かがこの交換のソースを教えてくれれば幸いです。
編集:これは質問とは関係ありませんが、の内部を使用する必要がある理由は、Text
IPv4 アドレスや MAC アドレスなどを効率的にエンコードするためです。以前の質問に含めた私のベンチマークでは、パブリック API を使用した最速の IPv4 エンコーディングtext
が約 450ns かかることがわかりました。内部を使用して (そして可変配列に直接書き込み)、約 35ns でこれを実行できます。これは、少なくとも 10 倍のパフォーマンスの向上です。
EDIT 2:私が覚えている他の何か(おそらく質問に関連している)は、コードの別の場所で、Data.Text.Lazy.Builder.Inthexadecimal
から使用したことです。ただし、ghcjs では、この関数はこのモジュールによってエクスポートされません。アップストリームのどこかに貢献できればうれしいのですが、すべてのモジュールがどのように取り除かれているのか理解できないため、適切なアップストリームがどこにあるのかわかりません。これが達成された特定のファイルを誰かが教えてくれれば幸いです。text