Option (単純な値の場合) や、エラーの処理に [List[Error], T] を使用する scala コードを何度も見てきました。
これは、このようなコードに場所を与えます
def createApplicationToken(accessToken: AccessToken): Either[List[Error], ApplicationToken] = {
// go to social info provider and fetch information
retrieveProviderInfo(accessToken).fold(
errors => Left(errors),
info => {
// try to find user using the info from the provider
// if it's not there, create user
User.findOrCreateFromProviderInfo(info).fold(
errors => Left(errors),
user => {
// try to create a fresh token and save it to the user
user.refreshApplicationToken.fold(
errors => Left(errors),
user => Right(user.token)
)
}
)
}
)
これはあまり良くないコードの入れ子を生成し、すべてのステップで失敗に対処することを強制し、すべての関数がいずれかを返すように強制します[...]
だから私は知りたいです
scala (または一般的な関数型プログラミング) では、例外の使用は推奨されません。
それらを使用することには欠点があります(不変性またはコードの同時実行性に関して)
例外が原則または関数型プログラミングと何らかの形で矛盾している
与えられた例をコーディングするより良い方法を考えることができます
--
returnステートメントを使用してエラーが見つかったらすぐに関数を終了することでネストを回避できますが、scalaではreturnの使用も推奨されません...