問題タブ [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.
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
)。
欠点は、新しい読者が一見しただけでは、このメソッドがTechnicalFailure
or CarCreationFailure
( BusinessFailure
so のサブクラス) を返すと推測できないことです。あまりにも恐ろしいThrowable
。
Throwable
彼は、誰かを忘れないようにするために、私のアプリケーションに含まれるすべての型にパターン マッチングを適用することを余儀なくされるでしょう... => 面倒。
これらのソリューションの中で最もクリーンな方法は何ですか、それとも...他の方法ですか?
scala - Scalaz 7 Iteratee で大きな zip ファイルを処理する (OutOfMemoryError)
scalaz iteratee パッケージを使用して、一定のスペースで大きな zip ファイルを処理しようとしています。zip ファイル内の各ファイルに対して実行する必要がある長時間実行プロセスがあります。これらのプロセスは並行して実行できます (また、並行して実行する必要があります)。
それぞれをオブジェクトにEnumeratorT
膨らませるを作成しました。署名は次のようになります。ZipEntry
File
IterateeT
各ファイルに対して長時間実行されるプロセスを実行するを添付したいと思います。私は基本的に次のようなものになります:
実行しようとすると:
java.lang.OutOfMemoryError: Java heap space
メッセージが届きます。IO
これらすべてとPromise
オブジェクトのメモリに大量のリストを構築しようとしているので、これは私には理にかなっています。
いくつかの質問:
- これを回避する方法について誰かアイデアがありますか?
longRunningProcess
私は本当にその副作用だけを気にしているので、私は問題に間違ってアプローチしているように感じます. - ここでの
Enumerator
アプローチは間違ったアプローチですか?
私はアイデアがほとんどないので、何でも役に立ちます。
ありがとう!
更新 #1
スタック トレースは次のとおりです。
私は現在、nadavwr のアドバイスを受けて、すべてが私が思うように動作していることを確認しています。更新があればまた報告します。
アップデート #2
以下の両方の回答からのアイデアを使用して、適切な解決策を見つけました。huynhjl が示唆したように (そして、ヒープ ダンプを分析するという nadavwr の提案を使用して確認しました)、consume
すべての膨張ZipEntry
したものがメモリに保持されていたため、プロセスがメモリ不足になりました。ファイルへの参照ではなく を返すように、実行時間の長いプロセスに変更consume
して更新しました。そうすれば、最後にすべての IoExceptions のコレクションを取得できます。実用的なソリューションは次のとおりです。foldM
Promise[IOE[Unit]]
このソリューションは、各エントリを非同期にアップロードしながらインフレートします。Promise
最後に、エラーを含む実行済みオブジェクトの膨大なリストがあります。これが Iteratee の正しい使用法であるとはまだ完全には確信していませんが、システムの他の部分で使用できる再利用可能で構成可能な部分がいくつかあります (これは私たちにとって非常に一般的なパターンです)。
ご助力いただきありがとうございます!
scala - Option の Monoid の scalaz の実装が f2 関数を 2 回評価するのはなぜですか?
scalaz のオプション モノイドの定義は次のとおりです。
f2
これは、各呼び出しが式を評価することを意味します。パターンマッチで評価されたばかりなのに、なぜ再度評価する必要があるのでしょうか? 返さSome(a2)
れる結果は同じである必要があり、式f2
は非常に高価になる可能性があります。
何か不足していますか?
scala - Scalaz 7 でトランスフォーマーを使用してモナド スタック間で変換する方法
モナドスタックとモナドトランスフォーマーを理解するのに苦労していScalaz7
ます。私は答えにかなり近づいていると感じていますが、特定のステップに頭を悩ませることはできません.
次のコードは、ディスク上でffmpeg
バイナリを検索し、実行する実行可能なコマンドを作成し、そのコマンドを実行して、出力に対して簡単な処理を行います。
コードは実行によって開始されます
callFfmpeg
このコードは機能しますが、の型シグネチャがIO[Option[Stream[String]]]
ではなく であることに気付くでしょうIO[Stream[String]]
。型チェックを行うには、それを変更する必要がありましたが、実際には、型シグネチャcallFfmpeg
を返すプロセスを実行するだけなので、 .Stream
IO[Stream[String]]
私の質問は、私が電話をかけたときに、どうやって にたどり着くかをcallFfmpeg
扱っていることを考えると、IO[Option[String]]
IO[Option[Stream[String]]]
scala - 配列型パズルセット
昨夜、この質問に答えて、次のことに気付きました。
つまり、foo
が整数のオプションのセットである場合、それを順序付けすると整数のセットが返されます。
シーケンス aは aF[G[A]]
を返すはずなので、これは最初は期待していませんでした(それがトラバース可能で、アプリケーション ファンクターであるG[F[A]]
と仮定します)。ただし、この場合、レイヤーは消えるだけです。F
G
Option
これはおそらく、 のスーパータイプの 1 つと機能する機械Set
との間の何らかの相互作用と関係があることを知っています。数分の時間を見つけることができたら、タイプを調べて、何が起こっているかの説明を書き上げる予定です。 .Unapply
sequenceU
しかし、それは潜在的に興味深い小さなパズルのように思えます。誰かが私を打ち負かして答えを得ることができる場合に備えて、ここに投稿すると思いました.
scala - scala 2.10 future を scalaz.concurrent.Future に変換 // タスク
scala の Future (2.10) を新しい scalaz7 future に適切に変換する方法を知っている人はいますか? scala Promise を介して scalaz future を scala Future に変換する方法は知っていますが、適切に変換する方法がわかりません。
例えば
実装したい
それから明らかに簡単に書くことができます
それが私が本当に欲しいものだから:-)
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 の場合にのみ追加が機能します。
これが良いアイデアだとは確信していませんが、問題は解決しています。