問題タブ [conduit]

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.

0 投票する
4 に答える
452 参照

exception - MonadResource のインスタンス内で IO 例外をキャッチする

短縮版

hereと同じ質問ですMonadResourceが、明示的ではなく一般的なインスタンス内にありますResourceT m

ロングバージョン

catch次のような関数をどのように定義しますか。

私が遭遇する問題は次のとおりです。

  • ではControl.ExceptioncatchIOの s でのみ機能します。
  • ではControl.Exception.Liftedcatchのインスタンスが必要ですが、残念ながらそうMonadBaseControlではありません(なぜだろうか)。MonadResource
  • MonadResourceMonadThrow'catch' に相当するものなしで関数を定義することを意味しますmonadThrow(そして、なぜだろうか)。

IO例外を処理する唯一の方法はレイヤーを終了することのように見えますが、ResourceTこれは私を悩ませています: モナドトランスフォーマースタックを経由せずにローカルで例外を処理できるようにしたい.

参考までに、私の実際のコードでは、abは実際には のhttp関数ですNetwork.HTTP.Conduit

あなたの洞察に感謝します。

問題のある最小限のコード

ghc --make example.hsライブラリがインストールされた状態でコンパイル可能http-conduit:

実行すると、このプログラムはエラーで終了し、次の出力が表示されます。

0 投票する
1 に答える
69 参照

haskell - Word8 - Conduit での ByteString エンコードの翻訳

私は、telnet クライアントをサイド プロジェクトとして動作させようとしています。この要点を基本的な例として見ました。ただし、コンパイルしてghciで実行すると、エンコーディングが文字化けすることがわかります。以下、登場人物の参考です。

私の推測では、これは、telnetがコードに 7 ビット ASCII / 特別な telnet ビットを使用する場合に、すべての送信で Conduit がデフォルトで UTF-8 を使用するためであると考えられます。また、標準出力/端末は、変換を行わなくても UTF-8 を直接解釈できますか?

前もって感謝します!

0 投票する
1 に答える
62 参照

haskell - コンジット: 別のソースからソースを作成する

私はいくつかのウェブサイトをソースクロールCategoryしており、それらから次のタイプのアイテムを収集しています:

次のステップは、会社コレクター (タイプ の項目Company) を作成することです。会社コレクターは、カテゴリを必要とします。入力ごとCategoryに、いくつかの会社を 1 つずつ生成する必要があります。言い換えればCompany、 ではなく「生成」する必要があり[Company]ます。このタスクには何が必要ですか? コンジットまたはトリッキーなソース? ソースの場合、カテゴリをどのように取得する必要がありますcatsSourceか? それが見つかった場合、どのように会社を転送(「利回り」)する必要がありますか?

ここで私の質問をクリアするには、試みです(型チェックに合格しません):

0 投票する
2 に答える
895 参照

haskell - コンジット - パイプライン内の複数の出力ファイル

入力ファイルが複数のファイルに分割されるプログラムを作成しています (シャミールの秘密共有スキーム)。

私が想像しているパイプラインは次のとおりです。

  • source: Conduit.Binary.sourceFile を使用して入力から読み取ります
  • コンジット: ByteString を受け取り、[ByteString] を生成します
  • シンク:コンジットから [ByteString] を取得し、各 ByteString ([ByteString] 内) を対応するファイルに書き込みます。(たとえば、入力 [ByteString] が bsl と呼ばれる場合、bsl !! 0ファイル 0、bsl !! 1ファイル 1 などに書き込まれます)

ここで複数の入力ファイルに関する質問を見つけましたが、その場合、入力ファイルごとにパイプライン全体が 1 回実行されますが、私のプログラムでは、パイプライン内の複数の出力ファイルに書き込みます。

また、ここでConduit のソース コードを調べて、自分で multiSinkFile を実装できるかどうかを確認していますが、sinkFile の Consumer 型に少し戸惑っています。まだ初心者です)

問題は、複数のファイルをシンクの一部として書き込むことを可能にする multiSinkFile のような関数をどのように実装すればよいかということです。

どんなヒントでも大歓迎です!

明確化

「ABCDEF」のバイナリ値 (3 つの部分) を含むファイルで Shamir の秘密共有を行いたいとします。

(つまり、入力ファイルsrcFileと出力ファイルoutFile0outFile1ありますoutFile2)

最初にファイルから「ABC」を読み取り、たとえば、のリストを取得する処理を行います["133", "426", "765"]。soは to 、to 、to"133"に書き込まれます。そして、 から「DEF」を読み取り、処理を行い、対応する出力を各出力ファイルに書き込みます。outFile0"426"outFile1"765"outFile2srcFile

編集:

回答ありがとうございます。ZipSinks などで何が起こっているのかを理解するのに時間がかかり、ソース ファイルの入力を取得して 3 つの出力ファイルに単純に書き込む簡単なテスト プログラムを作成しました。うまくいけば、これは将来他の人に役立つでしょう。

0 投票する
1 に答える
149 参照

haskell - ファイル名から派生したタイムスタンプを持つファイルの行を結合する

解析して処理する必要がある CSV ダンプ ファイルでいっぱいのディレクトリがあります。各ファイル名には、抽出方法を知っているタイムスタンプが含まれています。次に、ダンプからすべての行を処理する必要がありますが、各行について、そのファイルのタイムスタンプが何であったかを知る必要があります。タイムスタンプを個別に取得でき、ファイルからすべての行を個別に取得できます ( Haskell で `cat` を実装するにはどうすればよいですか? に従ってください) が、それらを結合する方法が見つかりません。何か案は?

編集: acomar のおかげで、私はこの解決策を持っています:

ファイルからの行を含む別のコンジットで、タイムスタンプを含む 1 つのコンジットを圧縮するアプローチを考えられる人はいますか? それが、この質問をする前に私がやろうとしていたことです。

0 投票する
2 に答える
687 参照

haskell - コンジット - 複数のソース/プロデューサーを 1 つに結合する

を使用してファイルから読み取っていますsourceFileが、処理操作にランダム性を導入する必要もあります。私が信じている最善のアプローチは、次のタイプのプロデューサーを持つことです

ここで、StdGen を使用して乱数を生成します。

プロデューサーが sourceFile のタスクを実行するだけでなく、データをダウンストリームに送信するたびに生成する新しいシードを生成することを意図しています。

zipSink私の問題は、シンクのようなソースコンバイナーがないように見えることです。Conduit Overviewを読むと、 a を a のSource中に埋め込むことができることが示唆されているようですがConduit、例ではそれがどのように行われているかわかりません。

Producer2 つ以上の IO ソースを 1 つの/に融合する例を誰か提供できますSourceか?

編集 :

例:

したがって、この例では、入力ファイルの内容を取得して出力ファイルに書き込み、ファイルの末尾に 40 ~ 50 のランダムな ASCII 値を追加します。(理由は聞かないで)

0 投票する
2 に答える
987 参照

haskell - コンジット - ByteString ソースをバイトのチャンクに分割する

ByteStringsourceFileストリームを取得します。

私の他の質問「複数のソース/プロデューサーを1つに結合する」をZipSink参照すると、を使用して(StdGen、ByteString)のsourceFileソースと、StdGenの無限ストリームを生成するカスタムソースを取得できます。

私が達成しようとしているのは、各 StdGen を 1 バイトの ByteString とペアにすることですが、現在の実装では、入力ファイルの内容全体とペアになった 1 つの StdGen を取得していますsourceFile

Conduit.Binaryの関数を調べましisolateたが、次のように使用するとうまくいかないようです。

Conduit の用語では、受信 ByteString ストリームの を生成しisolate、残りを (受信ストリームのキューに戻す) と考えました。基本的に、私がやろうとしているのは、着信 ByteString ストリームをバイトのブロックに切り刻むことです。awaitheadleftOver

私はそれを正しく使用していますか?私が使用すべき関数ではない場合isolate、誰かがそれを任意のバイトチャンクに分割する別の関数を提供できますか?

0 投票する
1 に答える
333 参照

haskell - アップロードされたファイルの内容を読み取る方法

CSV ファイルをアップロードして、最終的に DB に格納されるテーブルに解析しようとしています。私は Yesod のファイル アップロードの例をいじっていましたが、Yesod の最新バージョンでは動作しないようです。を使用してYesod 1.2.5.2 and GHC 7.6.3 on Ubuntu 14.04います。

以下は私のコードです

これは私があなたの助けを求めたい部分です:

ByteString を取得したら、Data.Csv を使用して次のように解析します。decode NoHeader s :: Either String (Vector (Vector ByteString))

アップロードされたファイルからファイルの内容を取得する方法を誰かに教えてもらえますか? ファイルをディスクに保存する必要はありません。

ありがとう!

0 投票する
1 に答える
309 参照

haskell - 慣用的な io-streams ディレクトリ トラバーサル

Reddit でいくつかのコードについて話し合っていたのですが、これが io-streams でどのように実装されるのかに興味を持ちました。ディレクトリ構造をトラバースし、すべてのファイル名を出力する次のコードを検討してください。

単純にファイルを印刷する代わりに、ある種のストリーミング ファイルパス表現を作成したいとします。これが列挙子、コンジット、およびパイプでどのように機能するかを知っています。ただし、中間ステップでは希少なリソース ( DirStream) を取得する必要があるため、io-stream の実装がどのようになるかはわかりません。誰かがそれがどのように行われるかの例を提供できますか?

比較のために、 と を介して可能になったコンジットの実装を次に示します。上記と同じファイル印刷プログラムを実装するためにコンジット コードを使用する方法を次に示します。bracketPMonadResource