問題タブ [scalaz7]

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 投票する
2 に答える
370 参照

api - 例外を扱う Scala メソッド シグネチャを記述する最良の方法

Scala で例外を処理するために、私は基本的なtry/catchを避け、Scalaz の関数型の考え方(場合によっては型にValidation似ています) の恩恵を受けることを好みます。Either

私のアプリケーションはいくつかのサービスを公開しています。私のサービスレイヤーでこの方法を想像してみてください(意味はありませんが、概念には適しています)。Buyer(購入者) を新しいものに関連付け、すべてのルールが成功した場合、この関連付けを含むCarを返します。Car

説明: を作成するCarと、両方の例外タイプのいずれかが発生する可能性があります:

  • 技術的な障害(たとえば、データベースがクラッシュしたとき) のラッピングThrowable例外。
  • ビジネスの失敗(たとえば、Car違法なステータスを持つなど、矛盾を防止するカスタム アプリケーションのルール)。もちろん、より多くの失敗CarCreationFailureによって拡張される可能性があります。precised

私の質問は、特にクライアント側に焦点を当てており、具体的には複数の可能性を扱っていますBusiness Failure

戻り値の型Validation[Either[TechnicalFailure, List[CarCreationFailure]], CarDTO]を扱いにくいものに置き換える必要があります。ValidationNel[Throwable, CarDTO]

ここに注意してくださいValidationNel(エラー/例外を に蓄積しますNonEmptyList)。

欠点は、新しい読者が一見しただけでは、このメソッドがTechnicalFailureor CarCreationFailure( BusinessFailureso のサブクラス) を返すと推測できないことです。あまりにも恐ろしいThrowable

Throwable彼は、誰かを忘れないようにするために、私のアプリケーションに含まれるすべての型にパターン マッチングを適用することを余儀なくされるでしょう... => 面倒。

これらのソリューションの中で最もクリーンな方法は何ですか、それとも...他の方法ですか?

0 投票する
3 に答える
712 参照

scala - Scalaz 7 Iteratee で大きな zip ファイルを処理する (OutOfMemoryError)

scalaz iteratee パッケージを使用して、一定のスペースで大きな zip ファイルを処理しようとしています。zip ファイル内の各ファイルに対して実行する必要がある長時間実行プロセスがあります。これらのプロセスは並行して実行できます (また、並行して実行する必要があります)。

それぞれをオブジェクトにEnumeratorT膨らませるを作成しました。署名は次のようになります。ZipEntryFile

IterateeT各ファイルに対して長時間実行されるプロセスを実行するを添付したいと思います。私は基本的に次のようなものになります:

実行しようとすると:

java.lang.OutOfMemoryError: Java heap spaceメッセージが届きます。IOこれらすべてとPromiseオブジェクトのメモリに大量のリストを構築しようとしているので、これは私には理にかなっています。

いくつかの質問:

  • これを回避する方法について誰かアイデアがありますか? longRunningProcess私は本当にその副作用だけを気にしているので、私は問題に間違ってアプローチしているように感じます.
  • ここでのEnumeratorアプローチは間違ったアプローチですか?

私はアイデアがほとんどないので、何でも役に立ちます。

ありがとう!

更新 #1

スタック トレースは次のとおりです。

私は現在、nadavwr のアドバイスを受けて、すべてが私が思うように動作していることを確認しています。更新があればまた報告します。

アップデート #2

以下の両方の回答からのアイデアを使用して、適切な解決策を見つけました。huynhjl が示唆したように (そして、ヒープ ダンプを分析するという nadavwr の提案を使用して確認しました)、consumeすべての膨張ZipEntryしたものがメモリに保持されていたため、プロセスがメモリ不足になりました。ファイルへの参照ではなく を返すように、実行時間の長いプロセスに変更consumeして更新しました。そうすれば、最後にすべての IoExceptions のコレクションを取得できます。実用的なソリューションは次のとおりです。foldMPromise[IOE[Unit]]

このソリューションは、各エントリを非同期にアップロードしながらインフレートします。Promise最後に、エラーを含む実行済みオブジェクトの膨大なリストがあります。これが Iteratee の正しい使用法であるとはまだ完全には確信していませんが、システムの他の部分で使用できる再利用可能で構成可能な部分がいくつかあります (これは私たちにとって非常に一般的なパターンです)。

ご助力いただきありがとうございます!

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

scala - Option の Monoid の scalaz の実装が f2 関数を 2 回評価するのはなぜですか?

scalaz のオプション モノイドの定義は次のとおりです。

f2これは、各呼び出しが式を評価することを意味します。パターンマッチで評価されたばかりなのに、なぜ再度評価する必要があるのでしょうか? 返さSome(a2)れる結果は同じである必要があり、式f2は非常に高価になる可能性があります。

何か不足していますか?

Scalaz の Option.scala ソース

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

scala - Scalaz 7 でトランスフォーマーを使用してモナド スタック間で変換する方法

モナドスタックとモナドトランスフォーマーを理解するのに苦労していScalaz7ます。私は答えにかなり近づいていると感じていますが、特定のステップに頭を悩ませることはできません.

次のコードは、ディスク上でffmpegバイナリを検索し、実行する実行可能なコマンドを作成し、そのコマンドを実行して、出力に対して簡単な処理を行います。

コードは実行によって開始されます

callFfmpegこのコードは機能しますが、の型シグネチャがIO[Option[Stream[String]]]ではなく であることに気付くでしょうIO[Stream[String]]。型チェックを行うには、それを変更する必要がありましたが、実際には、型シグネチャcallFfmpegを返すプロセスを実行するだけなので、 .StreamIO[Stream[String]]

私の質問は、私が電話をかけたときに、どうやって にたどり着くかをcallFfmpeg扱っていることを考えると、IO[Option[String]]IO[Option[Stream[String]]]

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

scala - 配列型パズルセット

昨夜、この質問に答えて、次のことに気付きました。

つまり、fooが整数のオプションのセットである場合、それを順序付けすると整数のセットが返されます。

シーケンス aは aF[G[A]]を返すはずなので、これは最初は期待していませんでした(それがトラバース可能で、アプリケーション ファンクターであるG[F[A]]と仮定します)。ただし、この場合、レイヤーは消えるだけです。FG Option

これはおそらく、 のスーパータイプの 1 つと機能する機械Setとの間の何らかの相互作用と関係があることを知っています。数分の時間を見つけることができたら、タイプを調べて、何が起こっているかの説明を書き上げる予定です。 .UnapplysequenceU

しかし、それは潜在的に興味深い小さなパズルのように思えます。誰かが私を打ち負かして答えを得ることができる場合に備えて、ここに投稿すると思いました.

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

scala - scala 2.10 future を scalaz.concurrent.Future に変換 // タスク

scala の Future (2.10) を新しい scalaz7 future に適切に変換する方法を知っている人はいますか? scala Promise を介して scalaz future を scala Future に変換する方法は知っていますが、適切に変換する方法がわかりません。

例えば

実装したい

それから明らかに簡単に書くことができます

それが私が本当に欲しいものだから:-)

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

scala - eitherT 内でタプルを返す方法

State と \/ をブレンドする for 内包表記を構築するために、Scalaz 7 の EachT を使用しています。ここまでは順調ですね; 私は基本的に何かを得ます:

これにより、<- の左側に素敵な変数を持つ for 内包表記を作成できます。

しかし、状態アクションからタプルを返す方法がわかりません。単一の結果は問題ありません。以下のコードでは、「val 内包表記」がまさに私が望んでいることです。

しかし、タプルを返したいときはうまくいきません。「val otherComprehension」は私をさせません

\/ の左側がモノイドであることを期待しているように見えますが、その理由がわかりません。私は何が欠けていますか?

(Scalaz 7 2.0.0-SNAPSHOT、Scala 2.10.2)

編集: MyLeftType がモナドであるという証拠を追加しましたが、そうではありません。私の実際のコードでは、MyLeftType はケース クラス (EarlyReturn と呼ばれます) であるため、0 を指定できますが、引数の 1 つが 0 の場合にのみ追加が機能します。

これが良いアイデアだとは確信していませんが、問題は解決しています。