2

私の知る限り、基本的にそれらは異なるタイプのモナドであるため、熱心であるIterator.map一方で怠惰です。Vector.map

EagerTryandが現在のLazyTryと同じように動作する可能性があるかどうかを知りたいのですが、後者の ( ) を使用すると、結果が必要になるまで (必要な場合)、渡されたクロージャーの実行が遅延します。TryLazyTry

lazyas の宣言は Scala ではうまく機能しないことに注意してください。特に、特定のスコープで機能します。パラメーター (名前によるパラメーター) を渡すときの代替手段が存在します。問題は、(遅延) 値を外部スコープに返すときに遅延動作を実現する方法です。Optionは基本的に長さ 0 または 1 のコレクションです。これは遅延コレクション ( IteratorSequence) と同等のケースですが、長さ 0 または 1 に制限されます (Optionおよび などEither)。私は特に興味があります。Tryつまり、使用されるのとLazyTryまったく同じようTryに使用します。これは他の場合でも同様であると思います(OptionおよびEither)。

EagerTry現在の標準Tryは熱心であるため、すでに があることに注意してください。残念ながら、クラスは封印されているため、同じクラスの熱心なバージョンと遅延バージョンを作成するには、そのうちの 3 つを定義し、2 つを実装する必要があります (1 つを定義して実装するのではなく)。Tryポイントは、他のソフトウェア層がそのコードの実行時間を気にせずにを返すこと、つまり抽象化です。

4

1 に答える 1

2

はい、書くのは難しくありませんLazyTry。1 つの可能なアプローチ:

sealed class LazyTry[A](block: => A) {
  // the only place block is used
  private lazy val underlying: Try[A] = Try(block)
  def get = underlying.get
  def isSuccess = underlying.isSuccess
  ...
}

object LazyTry {
  def apply[A](block: => A): LazyTry[A] = new LazyTry[A](block)
  ...
}

を実行する前に使用するクラスがわからないため、andがないことに注意してください。LazySuccessLazyFailureblock

于 2015-02-24T18:45:29.180 に答える