1
スカラッツの論理和を利用して、独自のエラータイプで例外をラップしたいと思います。カリング付き下限 - 簡略化可能?
次のコードは、
trait Result
trait Error extends Result
object MyError extends Error
object OK extends Result
val r: Error \/ OK.type = tryCatchIn(_ => MyError /*:Error*/) {
val result: Error \/ OK.type = ???
result
}
私はカリー化構文を維持したいのですがコンパイルする必要があり、明示的にMyError
を入力して好きではありません。
私の現在のソリューションは、二重の
def tryCatchIn2[L, R](exceptionTransformer: Throwable => L, `finally`: => Unit =() =>()): CatchFinally[L] = {
new CatchFinally(exceptionTransformer, `finally`)
}
class CatchFinally[L](val exceptionTransformer: Throwable => L, `finally`: => Unit =() =>()) {
def apply[L2 >: L, R](block: => L2 \/ R): L2 \/ R = try {
block
} catch {
case NonFatal(e) => -\/(exceptionTransformer(e))
} finally {
`finally`
}
}
私の最初を使用している、カリー化のアプローチは、はるかに良い私の意図を反映するだろうが、私はませそれが働いて得ることができます:
def tryCatchIn[L, R, L2 >: L](exceptionContainer: Throwable => L, `finally`: => Unit =() =>())
(block: => L2 \/ R): L2 \/ R = {
try {
block
} catch {
case NonFatal(e) => -\/(exceptionContainer(e))
} finally {
`finally`
}
}
は明確なソリューションです可能?
型を正しく推論することはできません。上記の例のコードをコンパイルしてみてください。 –
うーん、しました。たとえIntelliJワークシートでも、型を推測するのが悲惨に失敗しても、正常に動作します。 val result = tryCatchIn(e => s "例外が発生しました:$ {e.getMessage}"、println( "finally"))(1/0) val result2 = catchMe s "例外が発生しました:$ {e.getMessage}")(1/0) '' ' どちらもString \/Intとして推測されます。 – Markus
'trait Result'、' object MyError'などの3行目からサンプルコードを試しましたか? –