問題タブ [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.
exception - MonadResource のインスタンス内で IO 例外をキャッチする
短縮版
hereと同じ質問ですMonadResource
が、明示的ではなく一般的なインスタンス内にありますResourceT m
。
ロングバージョン
catch
次のような関数をどのように定義しますか。
私が遭遇する問題は次のとおりです。
- では
Control.Exception
、catch
裸IO
の s でのみ機能します。 - では
Control.Exception.Lifted
、catch
のインスタンスが必要ですが、残念ながらそうMonadBaseControl
ではありません(なぜだろうか)。MonadResource
MonadResource
MonadThrow
'catch' に相当するものなしで関数を定義することを意味しますmonadThrow
(そして、なぜだろうか)。
IO
例外を処理する唯一の方法はレイヤーを終了することのように見えますが、ResourceT
これは私を悩ませています: モナドトランスフォーマースタックを経由せずにローカルで例外を処理できるようにしたい.
参考までに、私の実際のコードでは、a
とb
は実際には のhttp
関数ですNetwork.HTTP.Conduit
。
あなたの洞察に感謝します。
問題のある最小限のコード
ghc --make example.hs
ライブラリがインストールされた状態でコンパイル可能http-conduit
:
実行すると、このプログラムはエラーで終了し、次の出力が表示されます。
haskell - Word8 - Conduit での ByteString エンコードの翻訳
私は、telnet クライアントをサイド プロジェクトとして動作させようとしています。この要点を基本的な例として見ました。ただし、コンパイルしてghciで実行すると、エンコーディングが文字化けすることがわかります。以下、登場人物の参考です。
私の推測では、これは、telnetがコードに 7 ビット ASCII / 特別な telnet ビットを使用する場合に、すべての送信で Conduit がデフォルトで UTF-8 を使用するためであると考えられます。また、標準出力/端末は、変換を行わなくても UTF-8 を直接解釈できますか?
前もって感謝します!
haskell - コンジット: 別のソースからソースを作成する
私はいくつかのウェブサイトをソースクロールCategory
しており、それらから次のタイプのアイテムを収集しています:
次のステップは、会社コレクター (タイプ の項目Company
) を作成することです。会社コレクターは、カテゴリを必要とします。入力ごとCategory
に、いくつかの会社を 1 つずつ生成する必要があります。言い換えればCompany
、 ではなく「生成」する必要があり[Company]
ます。このタスクには何が必要ですか? コンジットまたはトリッキーなソース? ソースの場合、カテゴリをどのように取得する必要がありますcatsSource
か? それが見つかった場合、どのように会社を転送(「利回り」)する必要がありますか?
ここで私の質問をクリアするには、試みです(型チェックに合格しません):
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
と出力ファイルoutFile0
がoutFile1
ありますoutFile2
)
最初にファイルから「ABC」を読み取り、たとえば、のリストを取得する処理を行います["133", "426", "765"]
。soは to 、to 、to"133"
に書き込まれます。そして、 から「DEF」を読み取り、処理を行い、対応する出力を各出力ファイルに書き込みます。outFile0
"426"
outFile1
"765"
outFile2
srcFile
編集:
回答ありがとうございます。ZipSinks などで何が起こっているのかを理解するのに時間がかかり、ソース ファイルの入力を取得して 3 つの出力ファイルに単純に書き込む簡単なテスト プログラムを作成しました。うまくいけば、これは将来他の人に役立つでしょう。
haskell - ファイル名から派生したタイムスタンプを持つファイルの行を結合する
解析して処理する必要がある CSV ダンプ ファイルでいっぱいのディレクトリがあります。各ファイル名には、抽出方法を知っているタイムスタンプが含まれています。次に、ダンプからすべての行を処理する必要がありますが、各行について、そのファイルのタイムスタンプが何であったかを知る必要があります。タイムスタンプを個別に取得でき、ファイルからすべての行を個別に取得できます ( Haskell で `cat` を実装するにはどうすればよいですか? に従ってください) が、それらを結合する方法が見つかりません。何か案は?
編集: acomar のおかげで、私はこの解決策を持っています:
ファイルからの行を含む別のコンジットで、タイムスタンプを含む 1 つのコンジットを圧縮するアプローチを考えられる人はいますか? それが、この質問をする前に私がやろうとしていたことです。
haskell - コンジット - 複数のソース/プロデューサーを 1 つに結合する
を使用してファイルから読み取っていますsourceFile
が、処理操作にランダム性を導入する必要もあります。私が信じている最善のアプローチは、次のタイプのプロデューサーを持つことです
ここで、StdGen を使用して乱数を生成します。
プロデューサーが sourceFile のタスクを実行するだけでなく、データをダウンストリームに送信するたびに生成する新しいシードを生成することを意図しています。
zipSink
私の問題は、シンクのようなソースコンバイナーがないように見えることです。Conduit Overviewを読むと、 a を a のSource
中に埋め込むことができることが示唆されているようですがConduit
、例ではそれがどのように行われているかわかりません。
Producer
2 つ以上の IO ソースを 1 つの/に融合する例を誰か提供できますSource
か?
編集 :
例:
したがって、この例では、入力ファイルの内容を取得して出力ファイルに書き込み、ファイルの末尾に 40 ~ 50 のランダムな ASCII 値を追加します。(理由は聞かないで)
haskell - コンジット - ByteString ソースをバイトのチャンクに分割する
ByteStringsourceFile
ストリームを取得します。
私の他の質問「複数のソース/プロデューサーを1つに結合する」をZipSink
参照すると、を使用して(StdGen、ByteString)のsourceFile
ソースと、StdGenの無限ストリームを生成するカスタムソースを取得できます。
私が達成しようとしているのは、各 StdGen を 1 バイトの ByteString とペアにすることですが、現在の実装では、入力ファイルの内容全体とペアになった 1 つの StdGen を取得していますsourceFile
。
Conduit.Binary
の関数を調べましisolate
たが、次のように使用するとうまくいかないようです。
Conduit の用語では、受信 ByteString ストリームの を生成しisolate
、残りを (受信ストリームのキューに戻す) と考えました。基本的に、私がやろうとしているのは、着信 ByteString ストリームをバイトのブロックに切り刻むことです。await
head
leftOver
私はそれを正しく使用していますか?私が使用すべき関数ではない場合isolate
、誰かがそれを任意のバイトチャンクに分割する別の関数を提供できますか?
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))
アップロードされたファイルからファイルの内容を取得する方法を誰かに教えてもらえますか? ファイルをディスクに保存する必要はありません。
ありがとう!
haskell - 慣用的な io-streams ディレクトリ トラバーサル
Reddit でいくつかのコードについて話し合っていたのですが、これが io-streams でどのように実装されるのかに興味を持ちました。ディレクトリ構造をトラバースし、すべてのファイル名を出力する次のコードを検討してください。
単純にファイルを印刷する代わりに、ある種のストリーミング ファイルパス表現を作成したいとします。これが列挙子、コンジット、およびパイプでどのように機能するかを知っています。ただし、中間ステップでは希少なリソース ( DirStream
) を取得する必要があるため、io-stream の実装がどのようになるかはわかりません。誰かがそれがどのように行われるかの例を提供できますか?
比較のために、 と を介して可能になったコンジットの実装を次に示します。上記と同じファイル印刷プログラムを実装するためにコンジット コードを使用する方法を次に示します。bracketP
MonadResource