2016-08-26 8 views
1

私はこれを行う正しい方法について興味があります。メソッドから成功または失敗を通知したいとします。成功の場合には何も言いたくない場合は、これが受け入れられるのですか?それ以外は成功しましたか?Scala Either With Unit

def fn(): Either[Throwable, Unit] 

と成功と、このメソッドから右()を返すために適切な方法は何ですか?どうやらRight()を返すだけで廃止予定の警告が表示されます(inserted()による引数リストの適用が廃止されました)。

私はおそらくOption [Throwable]を行うこともできますが、それはOptionの読み方の精神に反するものではありません。または、scala.util.Tryの結果を返し、成功/失敗を評価しますか?

- 廃止予定の警告に関しては、FYIです。

Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_101). 
Type in expressions for evaluation. Or try :help. 

scala> def fn:Either[Throwable, Unit] = { Right() } 
<console>:11: warning: Adaptation of argument list by inserting() has been deprecated: this is unlikely to be what you want. 
     signature: Right.apply[A, B](b: B): scala.util.Right[A,B] 
    given arguments: <none> 
after adaptation: Right((): Unit) 
     def fn:Either[Throwable, Unit] = { Right() } 
              ^
fn: Either[Throwable,Unit] 
+2

この場合、「Try [T]」は完全に意味があると思います。 –

+1

しかし、Tryは呼び出し元にエラー処理/回復を移します。着信者が復旧できる場合は着信音を鳴らすことをお勧めします。復帰できない場合にのみ失敗を返します。だから彼らはまったく同等ではありません。 –

答えて

1

私はそれがあなたが探しているAPIの種類によると言います。

def fn(): Either[Throwable, Unit]は私にとってはかなり慣れないと聞こえる。機能の主な結果が副作用である場合は、Eitherを使用する際には使用されていないようです。モナド操作チェーンのターミナル操作なので、これが起きましたか?

最近ではあまり普及しておらず、慣れも少なくなっていますが、おそらくTry[A]と一緒にそのケースを扱うことになります。他の慣用的な選択肢は、Eitherの例外をシャッフルするのではなく、すべてのエラー種類の密閉された特性階層を作成し、生のThrowableインスタンスではなく有効な関数から返されるものを返すことです。

Right()またはRight(())をREPLで呼び出すときに表示されるエラーは表示されません。どのバージョンのscalacを使用していますか?

+1

'Right()'は少なくとも2.11.8で警告します。 「[ユニット]を試してみる」の人気度は低いですか?または '試してみてください '私はTryを気に入らない人を読んだ。 OPと同様に、私は 'Try [Unit]'に落としてきましたが、 'Option [Throwable]'は私の興味を掻き立てる、悪いです: '{try {???}} .toOption' –

+0

@ som-snyttしかし、どのようにエラーmsgのロギングについての理由はありますか? –

+0

私は、廃止の警告を元の投稿に追加しました。そして、はい、Try()での私の躊躇は、多くの人々がそれをあまり好きではないように見えるということです。私はなぜそれが正しいかどうかを証明する何らかの数学かもしれないと主張していません。また、私のオリジナルのユースケースを列挙するために、(Java APIの使用のために)そうでなければ興味深いものを返しません。 –

2

タイプとしてUnitを使用して、()を返すことができます。

def fn(): Either[Throwable, Unit] = Right(())