問題タブ [storable]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - Vectorを作成するためにForeign.Storableを正しく実装する方法は?
私は、リストを使用して人工ニューラル ネットワーク操作を計算するプロジェクトに取り組んでいます。Data.Vector
今、私はその効率を改善するためにそれを変換したいと思います。しかし、私は現時点Foreign.Storable
で不可欠な定義を実装するのに苦労しています。
わかりましたので、最初にData.Array.Repa
、次のような型シノニムを計算に使用しました ( CAMTypes.hs
):
その後Data.Vector
、次のように使用したいと思いました。
ただし、次のエラーが表示されます。
の実装はすでに行っていますinstance Storable NTTVU where
が、まだ不満があります。プロファイリングを有効にしましたが、それについて詳しく教えてくれません。段階的にデバッグを試みましたが、成功しませんでした。うまくいけば、誰かがそれについて多くのことを知っていて、それを解決する方法.
より多くのコンテキスト、プロジェクト全体、および関連ファイルについては、次のとおりです。
c - Haskell FFI: 個別に割り当てられた文字列 (char*) を含む C 構造体をラップする
C構造体があるとします
f
そして、それに対して何らかの操作を行う関数、
C API は、char*
を呼び出す前に十分なバッファーを割り当てることを要求しf
ます。
(num
この構築された例では、フィールドには目的がないことに注意してください。これは、 and を使用した簡単な解決策を妨げるだけCString
ですCStringLen
。)
問題は、この種の C API 用の Haskell FFI をどのように作成するかです。
私が思いついたのはこれです:
Storable インスタンスを作成します。私の考えは、文字列のバッファとして機能する最後に 64 バイトを割り当てることです。
poke
割り当てられたバッファを指すように str のポインタを変更する必要があり、Haskell 文字列をそこにコピーする必要があります。私はこれを行いwithCStringLen
ます:
最後にpeek
、簡単な を次に示します。
これはすべて機能しますが、かなり醜いと思います。これはそれを行う方法ですか、それともより良い方法はありますか?
誰かがそれで遊びたい場合、小さなおもちゃの問題はgithubにあります。
アップデート
chi
次の警告で指摘されているように、ハードコーディングされたアライメントとオフセットを使用することは悪い習慣です。それらは壊れやすく、プラットフォーム/コンパイラに依存します。代わりに、c2hsc、c2hs またはbindings-dsl、greencardなどのツールを使用する必要があります。